ABAP - tabkindtabkeys

Tabkind(表类型):

1  标准表(STANDARD TABLE,系统为该表的每一行数据生成一个逻辑索引,自己内部维护着行号(Index)的编码。表的键值不唯一,且没有按照表键自动进行排序,支持通过索引访问和键访问两种方式。填充标准表时可以插入到指定位置或现在有行之后,程序对内表的寻址操作可以通过关键字或索引进行。在对表进行插入删除等操作时,各数据行在内存中的物理位置不变,系统仅重新排列各数据行的索引值。当经常用索引访问表的时候就选择标准表。

2  排序表(SORTED TABLE,也有一个逻辑索引,不同之处是排序表总是按其表关键字升序排序后现进行存储,排序内表自己内部也维护着行号的编号,表的键值可以唯一或者不唯一,支持通过索引访问和键访问两种方式。如果经常使用键来访问数据,或者希望数据能够自动排序时,就用排序表。

3  哈希表(HASHED TABLE,哈希表通过哈希函数生成的表键来标识和快速访问表行,哈希表中的表键没有顺序,其值在表中必须唯一,只允许通过表键来访问哈希表。寻址一个数据行的所需时间与表行数无关。如果内表非常大而且希望用主键访问,就用哈希表。

 

各种类型内表充许的访问方式(索引访问、关键字访问):标准内表主要是索引访问,排序内表主要是Key访问,而哈希内表只能通过Key来访问:

abap 索引怎么使用 abap指定索引_数据

abap 索引怎么使用 abap指定索引_访问表_02

对于索引类型的内表,当一个行操作语句执行结束后,SY-TABIX将返回该行的索引,成功SY-SUBRC返回0。

 

虽然索引比使用关键字定位行要快,但在大多数情况下,我们通过关键字定位一行数据,因数据来自数据库,我们不知道数据在哪行。

使用关键字定位一行数据不同内表的效率比较如下:

1  标准表,取决于表的行数,随行数线性增加。(但也可以先进行排序,再明确使用二分搜索查找)

2  排序表,取决于表的行数,随行数对数级增长(系统默认就会使用二分搜索方式来查找)。

3  哈希表,与行数无关,在大数据量的情况下根据关键字查询是最快的

 

Tabkeys表主键

如果不指定关键字(注:只有标准表可以不用指定索引类型与关键字,因为系统会给一个默认的关键字,即DEFAULTL KEY),则系统会使用默认(标准)关键字,如果指定,则有下列形式:

如果内表行结构是结构体,则可以指定结构体中的某几个字段作为内表关键字:

...WITH[UNIQUE|NON-UNIQUE]KEYcomp1 comp2 ...

请注意:多个关键字的排序顺序很重要,会影响到表的排序方式

如果内表的整个行都是由基本类型字段组成,或是由基本类型组成的结构类型字段:

...WITH[UNIQUE|NON-UNIQUE]KEYTABLE LINE|TABLE_LINE

TABLE LINE、TABLE_LINE:将表的整行作为Key,则可以使用TABLE_LINE

如果不指定任何关键字,则可以使用默认的标准关键字,该项为默认选项:

...WITH[UNIQUE|NON-UNIQUE]DEFAULTKEY...

 

排序表在指定Key的类型时,可以是UNIQUE也可以是NON-UNIQUE,所以排序内表是否可以存储重复的,则就是看定义时指定的Key类型是UNIQUE还是NON-UNIQUE

 

标准表只能使用NON-UNIQUE(但可以省略);排序表可以用NON-UNIQUE或UNIQUE(不能省略);哈希表只能使用UNIQUE(不能省略)。

 

在定义内表时,可以不指关键字,此时使用默认(标准)关键字,即相当于 WITH KEY DEFAULT KEY。如果定义的是STANDARD TABLE,则连WITH KEY DEFAULT KEY选项都可以省略;但如果是SORTED TABLE与HASHED TABLE,如是需要指定为DEFAULT KEY时,不能省略WITH KEY DEFAULT KEY,并且需要确保该内表里有可有作为默认Key的字段——如字符类型字段,否则不能通过编译。

 

在定义排序表与哈希表时,一定要指定索引类型与关键字(可以指定为WITH KEY DEFAULT KEY),否则编译通过不过。