本节介绍以下内容:
■选择列和表达式到索引
■选择复合索引
选择列和表达式索引
键是可以构建索引的列或表达式。 请按照以下准则选择索引键:
■考虑索引在WHERE子句中经常出现的键。
■考虑索引经常在SQL语句中连接表的键。有关优化联接的详细信息,请参阅第14-11页的“使用哈希群集进行性能”。
■选择具有高选择性的索引键。索引的选择性是表中具有相同索引键值的行的百分比。如果少数行具有相同的值,则索引的选择性是最佳的。
当数据分布偏斜时,索引低选择性列可能会有所帮助,这样一个或两个值的出现频率远低于其他值。
■不要在具有很少不同值的键或表达式上使用标准B树索引。这些键或表达式通常具有较差的选择性,因此除非频繁选择的键值出现频率低于其他键值,否则不会优化性能。在这种情况下,您可以有效地使用位图索引,除非频繁修改索引,如在高并发OLTP应用程序中。
■不要索引经常修改的列。修改索引列的UPDATE语句和修改索引表的INSERT和DELETE语句比没有索引的时间要长。此类SQL语句必须修改表中的索引和数据中的数据。他们还创建了额外的撤消和重做。
■不要将仅出现在带有函数或运算符的WHERE子句中的键索引。使用MIN或MAX以外的函数的WHERE子句或具有索引键的运算符不会使使用索引的访问路径(基于函数的索引除外)不可用。
■在大量并发INSERT,UPDATE和DELETE语句访问父表和子表的情况下,考虑索引引用完整性约束的外键。这样的索引允许父表上的UPDATE和DELETE而不共享锁定子表。
■选择索引键时,请考虑查询的性能增益是否值得INSERT,UPDATE和DELETE的性能损失以及使用存储索引所需的空间。您可能希望通过比较带有和不带索引的SQL语句的处理时间来进行实验。您可以使用SQL跟踪工具测量处理时间。
选择综合指数
复合索引包含多个键列。与单列索引相比,复合索引可提供额外的优势:
■提高选择性
有时您可以组合两个或多个列或表达式,每个列或表达式具有较差的选择性,以形成具有更高选择性的复合索引。
■减少I / O.
如果查询选择的所有列都在复合索引中,则Oracle数据库可以从索引返回这些值,而无需访问该表。
当语句包含使用索引的前导部分的构造时,SQL语句可以使用涉及复合索引的访问路径。
索引的前导部分是在创建索引的CREATE INDEX语句的列列表中首先和连续指定的一个或多个列的集合。考虑这个CREATE INDEX语句:
CREATE INDEX comp_ind
ON table1(x,y,z);
■x,xy和xyz列的组合是索引的前导部分
■yz,y和z的列组合不是索引的前导部分
选择复合索引的键
请遵循以下准则来选择复合索引的键:
■考虑在与AND运算符结合使用的WHERE子句条件中经常出现的键上创建复合索引,尤其是当它们的组合选择性优于单独的任一键的选择性时。
■如果多个查询根据一个或多个键值选择同一组键,则考虑创建包含所有这些键的复合索引。
当然,请考虑与前面部分中描述的索引的一般性能优势和权衡相关的准则。