数据库表中的索引可以加快查询的速度。索引是数据库表字段的有序副本。附加的字段包含指向真实数据库表行的指针。排序可以使访问表行的速度变快,例如,可以使用二分搜索。数据库表至少有一个主索引,由它的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个索引,因为,
每个索引都会增加更新开销。
数据量会增加。
数据库优化器会因为可选择的索引过多变得更加容易出错。