数据库表中的索引可以加快查询的速度。索引是数据库表字段的有序副本。附加的字段包含指向真实数据库表行的指针。排序可以使访问表行的速度变快,例如,可以使用二分搜索。数据库表至少有一个主索引,由它的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)中使用附加项%_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索引入门简述

SAP中的数据库表索引的更多相关文章

  1. db2数据库中查找数据库表

    模糊查找db2数据库中的数据库表: select tabname,remarks from syscat.tables where TABNAME like  'DM%' select 'DROP T ...

  2. Salesforce和SAP Netweaver里数据库表的元数据设计

    从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce.com/page/Multi_Tenant_ ...

  3. 通过DBCC整理Sqlserver数据库表索引碎片

    昨天检查了一张效率极慢的表,两年多没有维护,逻辑扫描碎片高达99.%,于是开始对这个表进行重点跟踪和记录日志.今天用DBCC SHOWCONTIG WITH TABLERESULTS 命令检查了一下所 ...

  4. MySQL数据库中查询数据库表、字段总数量,查询数据总量

    最近要查询一些数据库的基本情况,由于以前用oracle数据库比较多,现在换了MySQL数据库,就整理了一部分语句记录下来. 1.查询数据库表数量 #查询MySQL服务中数据库表数据量 SELECT C ...

  5. Spring中获取数据库表主键序列

    在程序开发中,我们经常有写数据库表的操作,数据表中经常带有主键自增序列,如何获取自增序列.spring中提供了相应的类 DataFieldMaxValueIncrementer. DataFieldM ...

  6. JPA中建立数据库表和实体间映射小结

    在JPA中,映射数据库表和实体的时候,需要注意一些细节如下, 实体类要用@Entity的注解: 要用 @Id 来注解一个主键: 如果跟数据库相关联,要用@Table注解相关数据库表: 实体类中字段需要 ...

  7. java开发_mysql中获取数据库表描述_源码下载

    功能描述: 在mysql数据库中,有两张表: data_element_config , test_table 我们需要获取表:test_table表的描述信息,然后把描述信息插入到表:data_el ...

  8. 十六、SAP中查看数据库

    一.我们输入事务代码SE11 二.我们输入数据库表 : “SPFLI” 三.我们可以查看到这个表相关的数据,这个是SAP自带的一个教学案例表. 四.我们点击Display,来查看这个表内容 五.点击查 ...

  9. SAP ABAP里数据库表的Storage Parameters从哪里来的

    如何查看ABAP数据库表的storage parameter? 事务码SE11,utilities->Database Object->Database Utility: 点这个Stora ...

随机推荐

  1. 利用keytool、openssl生成证书文件

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52225073 本文出自: [HansChen的博客] 用openssl指令逐步生成各 ...

  2. 数据表与简单java类——一对多映射

    例如:给定一个分类表和子分类表 得到如下信息: 1.一个分类的完整信息: 2.根据分类获取其对应的子分类 package Mapping_transformation; class item { pr ...

  3. 【前端】之jQuery基础知识

    jQuery 简介 在项目中引入jQuery: 去jQuery官网下载jQuery包:jquery-3.2.1.min.js 将下载的jQuery包添加到项目目录中 在标签下添加jQuery引用:&l ...

  4. 【Android - 进阶】之Animation补间动画

    补间动画也叫View动画,它只能针对View进行动画操作,且补间动画操作的只是View中可见的部分,即只操作界面,对于可点击区域等都不会进行操作. 在Android中,补间动画的顶级类是Animati ...

  5. python logging模块小记

    1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message') logging.info('This is info messa ...

  6. flask-简介

    什么是flask? Flask简介: Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务,在介绍Flask之前首先来聊下它和Django的联系 ...

  7. 修改TabBarViewController上标题字体颜色

    UINavigationController *newNavVc = [[UINavigationController alloc]init]; newNavVc.title = title; new ...

  8. 如何在导航条的button点击变换时,切换对应的控制器

    1.导航条内的button被点击 切换对应的控制器 让控制器作为调航条的代理 1.定义代理 2.遵循代理协议 3.实现代理 4.在合适的地方调用代理    当按钮被点击的时候切换控制器

  9. js对象可扩展性和属性的四个特性(上)

    # js对象可扩展性和属性的四个特性(上) 一.前言 再次花时间回顾一下基础,毕竟要想楼建的好,地基就要牢固,嘻嘻! 在开始之前需要具备对prototype.__proto__.constructor ...

  10. 使用Jq实现弹出层

    对于前端程序员来说,弹出层是经常用到的,下面我叫大家如何用实现JQuery实现弹出层的效果,代码如下: CSS:弹出层的效果 .mask { position: absolute; top: 0px; ...