SAP中的数据库表索引

数据库表中的索引能够加快查询的速度。索引是数据库表字段的有序副本。附加的字段包含指向真实数据库表行的指针。排序可使访问表行的速度变快,例如,可使用二分搜索。数据库表至少有一个主索引,由它的key字段定义。它也能够有一到多个二级索引。html

本文连接:http://www.javashuo.com/article/p-rimcalnr-dz.html sql

英文原文:https://help.sap.com/doc/abapdocu_753_index_htm/7.53/en-US/abenddic_database_tables_index.htm数据库

主索引

主索引是由主键的key字段构造的惟一索引,AS ABAP总会自动建立它。对于每一个索引字段的组合,表中最多只能有一条记录。 若是没法使用主索引识别记录集,好比说,没有使用主索引查询字段,就会发生全表扫描,可能致使查询性能不佳,或者数据库系统会尝试使用合适的二级索引(若是有的话)。缓存

二级索引

除了由主键定义的主索引,也能够为数据库表定义惟一或不惟一的二级索引。建立二级索引一般会提升数据库的读性能,前提是读取的时候使用到了二级索引。nosql

二级索引包含一系列数据库表字段,有一个最大3位长度的文本数字组成的ID。0是一个保留ID,用来表示主索引。string和rawstring类型的字段没法成为索引字段(全文索引除外)。也不建议使用数据类型FLTP的字段做为索引字段。ide

数据库表在数据库中被建立的时候,二级索引也会被定义。此外,能够晚些在相同的系统中建立新的二级索引。若是若是在其余系统增长新的二级索引而不做修改的话,它们会被建立为扩展索引。如下是建议的索引的命名空间:性能

  • 客户为标准表添加的索引ID前缀为'Y'或者'Z'。
  • 合做伙伴为标准表添加的索引ID前缀为'J',不一样合做伙伴建立的索引的名称可能冲突。
  • 其余表能够有任意名字的索引,不过不该以'Y','Z'或'J'开头。

数据库中的索引名字一般是DBTAB~ID,DBTAB是数据库表的名字,ID是3位字符的ID。也可能有其它名字,好比空格或下划线。优化

二级索引能够是惟一的,可是(不像主索引)不必。对惟一索引而言,数据库表不能含有一样索引值的多行数据。试图插入重复的行,会取消数据库操做,并在ABAP中触发相应的异常。在指定了client的表中,惟一索引必须包含client字段。ui

访问数据库时,数据库系统的优化器会检查是否有合适的索引,并使用它。索引的选择取决于平台,意味着能够在ABAP字典中定义非惟一索引在不一样的数据库系统中是否可用。有几种选项,spa

  • 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)中使用附加项%_HINTSdatabase 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索引入门简述

相关文章
相关标签/搜索