SAP中的数据库表索引
数据库表中的索引可以加快查询的速度。索引是数据库表字段的有序副本。附加的字段包含指向真实数据库表行的指针。排序可以使访问表行的速度变快,例如,可以使用二分搜索。数据库表至少有一个主索引,由它的key字段定义。它也可以有一到多个二级索引。
本文链接:https://www.cnblogs.com/hhelibeb/p/11061879.html
英文原文:https://help.sap.com/doc/abapdocu_753_index_htm/7.53/en-US/abenddic_database_tables_index.htm
主索引
主索引是由主键的key字段构造的唯一索引,AS ABAP总会自动创建它。对于每个索引字段的组合,表中最多只能有一条记录。 如果无法使用主索引识别记录集,比如说,没有使用主索引查询字段,就会发生全表扫描,可能导致查询性能不佳,或者数据库系统会尝试使用合适的二级索引(如果有的话)。
二级索引
除了由主键定义的主索引,也可以为数据库表定义唯一或不唯一的二级索引。创建二级索引通常会提高数据库的读性能,前提是读取的时候使用到了二级索引。
二级索引包含一系列数据库表字段,有一个最大3位长度的文本数字组成的ID。0是一个保留ID,用来表示主索引。string和rawstring类型的字段无法成为索引字段(全文索引除外)。也不建议使用数据类型FLTP的字段作为索引字段。
数据库表在数据库中被创建的时候,二级索引也会被定义。此外,可以晚些在相同的系统中创建新的二级索引。如果如果在其他系统增加新的二级索引而不作修改的话,它们会被创建为扩展索引。以下是建议的索引的命名空间:
- 客户为标准表添加的索引ID前缀为'Y'或者'Z'。
- 合作伙伴为标准表添加的索引ID前缀为'J',不同合作伙伴创建的索引的名称可能冲突。
- 其他表可以有任意名字的索引,不过不应以'Y','Z'或'J'开头。
数据库中的索引名字通常是DBTAB~ID,DBTAB是数据库表的名字,ID是3位字符的ID。也可能有其它名字,比如空格或下划线。
二级索引可以是唯一的,但是(不像主索引)没必要。对唯一索引而言,数据库表不能含有同样索引值的多行数据。试图插入重复的行,会取消数据库操作,并在ABAP中触发相应的异常。在指定了client的表中,唯一索引必须包含client字段。
访问数据库时,数据库系统的优化器会检查是否有合适的索引,并使用它。索引的选择取决于平台,意味着可以在ABAP字典中定义非唯一索引在不同的数据库系统中是否可用。有几种选项,
- Index in all database systems:这个索引会在每个数据库中创建。
- In selected database systems:可以使用选择列表或排除列表来定义数据库系统,每个列表最多有4个条目。
- No database index:不在任何数据库中创建索引,这个选项可以用于删除二级索引。
这些选项对表缓存的二级索引无效。如果表缓存有相关设置,那么系统就会根据表缓存的设置决定是否使用二级索引。
唯一二级索引总是会被创建,而且无法从数据库删除。可以使用事务代码ST05中的SQL跟踪功能来判断访问数据时系统使用的索引。
索引对于查询数据的提升效果取决于索引代表结果数据集的能力。只有索引中可以对结果集进行有效约束的字段才是有用的。这种情况下,索引中的字段顺序是一个对于数据的访问速度十分重要的因素。第一个字段必须是那些有着大量不同可选值的字段。在查询中,要在查询条件中指定索引的第一个字段,这样索引才有用。另外,只有一个索引字段前面的全部索引字段都在查询条件内时,这个索引字段才生效。字段的访问速度和索引是否为唯一索引无关。
对于以下情况,创建二级索引可以带来好处:
- 如果需要查询的表记录不包含在现有索引内,响应时间很久,应该创建二级索引。
- 这个字段的选择性很强,每个值可以用于区分少于5%的表记录。
- 数据库主要用于读取。因为更改表时也需要更新索引,会降低写入性能。
- 如果读取的字段也在索引里,那么在访问索引后不需要再次从索引之外读取它们。如果只有少量字段经常被选择,把它们全部包含在索引里的做法可以大大提高性能。
注:选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值, Index Selectivity = Cardinality / #T
二级索引也会增加系统负载,因为每次表内容被修改时,二级索引都要做相应调整。表的每个额外的索引都会降低插入行的性能。如果需要频繁在表中插入数据,那么应该只建立很少的索引。太多索引也会导致数据库的优化器找不到正确的索引。为了避免这点,表中的索引最好不相交(没有相同的字段)。
索引应该只包含几个字段,比如,原则上不超过4个。这是因为索引字段在被更新的时候,索引也要被更新。适合作为索引的字段是:
- 经常被查询,并且选择性高。需要把选择性最高的字段放在索引的开始位置。
- 如果一个字段在大部分表记录中的值都是初始值,那么它不应成为索引字段。
- 如果一个数据库表有不止一个索引,那么索引间不应该重叠。
不应该为一个表创建超过5个索引,因为,
- 每个索引都会增加更新开销。
- 数据量会增加。
- 数据库优化器会因为可选择的索引过多变得更加容易出错。
索引只支持明确的条件值,比如=或者LIKE。如果条件中包含某些不确定因素,比如<>,那么索引将无法改善性能。条件中包含OR时,优化器通常停止工作。换句话说,使用索引时,OR条件的字段是不生效的。一个例外是OR关系互相独立。因此,对于包含OR和索引字段结合的条件,有时需要修改条件的形式。(可以看下面的例子)
注意
- 某些数据库的索引会忽略0,意味着查询0值时,没有索引可用。
- 如有必要,可以在ABAP SQL(Open SQL)中使用附加项%_HINTS为database hints来调整系统优化器,以决定使用哪个二级索引。
例子
下面这个句子会导致优化器无法使用索引,因为遇到了OR:
SELECT * FROM spfli WHERE carrid = 'LH' AND ( CITYFROM = 'FRANKFURT' OR cityfrom = 'NEW YORK' ).
替换成下面这样的一个相等的句子,可以根据现有索引对整个条件进行优化(原因见前文):
SELECT * FROM spfli WHERE ( carrid = 'LH' AND cityfrom = 'FRANKFURT' ) OR ( carrid = 'LH' AND cityfrom = 'NEW YORK' ).
全文索引
SAP HANA数据库支持全文索引,全文索引可以作为二级索引。全文索引会在数据库中被创建为一个额外的可见的列。全文索引的列的内容会被保存在这个额外的列中,以某种格式存储,在相关数据被访问的时候会发挥作用。
以下是全文索引的使用条件:
- 只有对SAP HANA数据库中的列存储类型的表,才可以创建全文索引。
- 只能为数据类型为指定的几种内建数据类型的列(CHAR, SHORTSTRING, STRING, or RAWSTRING)创建全文索引,一个全文索引只能对应一个列。
- 数据库表必须包含一个文本语言列。
全文索引总是非唯一索引。使用全文索引的访问基于数据库中的WHERE CONTAINS元素。目前这个元素在ABAP SQL中还不可用,需要使用Native SQL或者AMDP。
注意
更多有关全文索引的信息,参看:SAP HANA Developer Guide.
参考阅读:MySQL索引入门简述