索引总结

来源:互联网 发布:如何不越狱下载软件 编辑:程序博客网 时间:2024/06/06 00:33
创建的索引应该取决于数据和存取该数据的查询
一下准则可帮助您确定如何创建可用于各种目的的索引:


要避免某些排序,只要有可能,就使用 CREATE UNIQUE INDEX 语句定义主键和唯一键
要改善数据检索,将INCULDE列添加至唯一索引。合适的列为:

被频繁存取,因此可从完全索引访问(index access only)受益的列
不需要用来限制索引扫描的范围的列
不影响索引键的排序或唯一性的列
要有效存取小表,使用索引来优化对含有较多数据页的表的频繁查询,数据页数记录在SYSCAT.TABLES目录视图的NPAGES列中。您应该:
根据连接表时需要使用的任何一列来创建索引
根据将用于定期索引特定值的任何列来创建索引
要有效地搜索,对键使用升序还是降序取决于将最常使用的次序。尽管当在 CREATE INDEX 语句中指定了 ALLOW REVERSE SCANS参数时可以按逆向方向搜索值,
但是,执行指定索引次序的扫描比执行逆向扫描稍微更快一些。


要节省索引维护成本和空间:

避免创建的索引是这些列上其他索引键的部分键。例如,如果列a,b和c上有索引,则列a和b上的第二个索引一般用处不大。
不在所有列上任意创建索引,不必要的索引不仅占用空间,而且会导致大量准备时间,但是用具有动态编程连接枚举的优化级别时,对于复杂的查询这特别重要。
使用下列一般规则来确定将为表定义的索引的典型数目。此数目根据数据库的主要使用来确定:
对于在线事务处理(OLTP)环境,创建2个或者3个索引
对于只读查询环境,可以创建5个以上的索引

对于混合查询和在线事务处理环境,可以创建2到5个索引

要改进对父表执行的删除和更新操作的性能,在外键上创建索引。
对于快速排序操作,在频繁用于排序数据的列上创建索引。
要改进多列索引的连接性能,如果第一个键列有多项选择,则使用最常用的“=”(等值连接)谓词制定的那一列,或使用如第一个键那样具有最多不同值的那些列。
要帮助新插入的行根据索引进行群集并避免页分割,定义一个集群索引。集群索引应显著减少重组表的需要。
当定义表时使用PCTFREE关键字来制定页上应该留下多少可用空间,才能允许将插入行适当的放在页上。也可以制定LOAD命令的pagefreespace MODIFIED BY 字句。


要启用联机索引整理碎片,创建索引时使用MINPCTUSED选项。MINPCTUSED指定索引叶子页中最小使用空间量的阀值并启用联机索引整理碎片。如果这些删除实际上是从索引页出去键,则可以在键删除期间以性能损失为代价而减少重组的需要。



在下列情况下,考虑创建索引:
在最频繁处理的查询和事务的WHERE子句中所使用的那些列上创建索引。
例如以下WHERE字句
WHERE WORKDEPT=A01 OR WORKDEPT=E21
通常将会从WORKDEPT上的索引获益,除非WORKDEPT列包含许多重复值。
在按查询所需要的顺序对行排序的一列或多列上创建索引。不仅在ORDER BY 子句中,而且其他功能,如DISTINCT和GROUP BY字句也都需要排序。
例如以下示例使用DISTINCT字句:
SELECT DISTINCT WORKDEPT FROM EMPLOYEE
使用符合键创建索引,该键命名语句中引用的每个列。当用此方式制定索引时,,可以从纯索引检索数据,这比存取表更有效。
例如,考虑下列SQL语句:
SELECT LASTNAME FROM EMPLOYEE WHERE WORKDEPT IN ('A00','D11','D21')
如果为EMPLOYEE表的WORKDEPT和LASTNAME列定义了索引,那么通过扫描索引而不是扫描整个表可能会更有效地处理该语句。注意,因为该谓词基于WORKDEPT,
因此此列应是该索引的第一列。
使用INCLUDE列创建索引可改善表上索引的使用。使用上述示例,可将唯一索引定义为:
CREATE UNIQUE INDEX x ON employee(workdept) INCLUDE (lastname)
指定lastname为INCLUDE列而不是索引键的一部分,意味着lastname只存储在索引的叶子页上。
原创粉丝点击