概述:
标准表:关键字为STANDARD TABLE, 系统为该表的每一行数据生成一个逻辑索引。 填充标准表时,可以将数据附加在现有行之后,也可以插入到指定的位置,程序对内表行的寻址操作可通过关键字或索引进行。在对表进行插入、删除等操作时,各数据行在内存中的位置不变,系统仅重新排列各数据行的索引值。
排序表:关键字为 SORTED TABLE, 也具有一个逻辑索引,不同之处是排序表总是按其关键字升序排序后再进行存储,其访问方式与标准表相同。
哈希表:关键字为 HASHED TABLE, 没有索引,只能通过关键字来访问。系统用哈希算法管理表中的数据,因而其寻址一个数据行的时间和表的行数无关。
除以上三种类型之外,还有一般性类型,即索引表 INDEX TABLE和人意表ANY TABLE. 一般性类型可以用于类型定义中,但不能用于声明一个内表对象,因为它并没有指明任何明确的表类型,因而系统无法确定对其操作方式。一般性类型还可以用于指明字段符号和接口参数的类型,以增加这些元素的适用性,其实际类型可能在运行期内才能够确定。
Standard Table | • Processed mainly by Index Operation • Key is always non-unique • Can be filled very quickly |
Sorted Table | • Access mainly by a Fixed Key (efficient) • Index operation seldom • The response time for key access is logarithmically proportional to the number of table entries • Key can be unique or non-unique • Data is inserted as per key |
Hashed Table | • Access only by key (fast) • Key must be unique • No index operation • The response time is independent of the number of table entries, and is constant, since the system access the table entries using a hash algorithm |
Table选择,以及性能优劣:
Slowest table accesses are sequential and grow linearly with n.
¨ READ standard table WITH (TABLE) KEY (no BINARY SEARCH)
¨ LOOP at standard/hashed table.
¨ READ sorted/hashed table WITH KEY (not TABLE KEY).
Faster accesses use a sorted index and have a weak dependence on n.
¨ READ standard table WITH (TABLE) KEY using BINARY SEARCH)
¨ READ sorted table WITH TABLE KEY.
¨ LOOP at sorted table.
Fastest access independent of n.
¨ READ hashed table WITH TABLE KEY.
¨ READ standard table WITH INDEX
¨ READ sorted table WITH INDEX.
Note: n = number of lines in the internal table
三种内表特点:
读取方式:
NON-UNIQUE|UNIQUE :NON-UNIQUE|UNIQUE(非特有/特有)决定了内表中具有相同关键字的数据行是否可以重复出现(即如果指明为UNIQUE KEY,则通过表关键字能够唯一确定内表的行,在程序中不能插入具有相同表关键字的多行数据条目),其中标准表不能用UNIQUE关键字,且无需特别制定NON-UNIQUE关键字;排序表两者都可以;哈希表不能用NON-UNIQUE关键字,且必须指定UNIQUE关键字。
INITIAL SIZE n: n可以为0或者任意正数,除非系统管理员限定一个最大值。无论n值选择为多大,都不会影响程序的正确性,但可能会影响程序效率。 如果初始值n小于所需,系统会根据需要自动要求增加内存大小,这个过程需要占用一定的时间;如果n值过大,实际数据的行数少于定义,则会造成内存分配的浪费。
所以n值的选择应该尽量接近于实际所需。如果n为0或者不指定,程序会为内表对象分配8KB大小的内存。所以,如果比较小,不要把该值设为0,避免浪费内存。