2008-10-17 66 views
28

我想知道是否有创建索引的一般规则或不。 如何选择我应该在这个索引中包含哪些字段或何时不包含它们?如何选择和优化oracle索引?

我知道它总是依赖于环境和数据量,但我想知道我们是否可以制定一些全球公认的有关在Oracle中创建索引的规则。

回答

52

Oracle文档有索引选择一个优秀组的考虑:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

报价:

  • 考虑经常使用在WHERE子句的索引键。

  • 考虑在SQL语句中频繁使用索引键来连接表。有关优化连接的更多信息,请参阅“使用散列簇实现性能”一节。

  • 选择具有高选择性的索引键。索引的选择性是表中具有相同值的索引键中行的百分比。如果少数行具有相同的值,那么索引的选择性是最佳的。注意:Oracle会自动创建索引或使用现有索引对您使用完整性约束定义的唯一键和主键的键和表达式。 如果数据分布偏斜,使得一个或两个值的出现次数少于其他值,那么对低选择性列建立索引会很有帮助。

  • 不要在键或具有很少不同值的表达式上使用标准B树索引。这些键或表达式通常选择性较差,因此不会优化性能,除非频繁选择的键值显示的频率低于其他键值。在这种情况下,您可以有效地使用位图索引,除非索引经常修改,例如高并发OLTP应用程序。

  • 不索引经常修改的列。修改索引列的UPDATE语句和修改索引表的INSERT和DELETE语句比没有索引时花费的时间更长。这些SQL语句必须修改索引中的数据以及表中的数据。他们还产生额外的撤消和重做。

  • 请勿索引仅在WHERE子句中出现的键与函数或运算符。使用除MIN或MAX以外的函数的WHERE子句或具有索引键的运算符不能提供除使用基于函数的索引之外的使用索引的访问路径。

  • 考虑在大量并发INSERT,UPDATE和DELETE语句访问父表和子表的情况下,对引用完整性约束的外键编制索引。这样的索引允许父表上的UPDATE和DELETE不共享锁定子表。

  • 选择索引键时,请考虑查询的性能增益是否值得INSERT,UPDATE和DELETE的性能损失以及使用存储索引所需的空间。您可能想通过比较有和无索引的SQL语句的处理时间进行实验。您可以使用SQL跟踪工具来测量处理时间。

10

有一些事情你应该总是指标:

  • 主键 - 这些都是给自动索引(除非你指定一个合适的现有指数为Oracle使用)
  • 独特的钥匙 - 这是给自动索引(同上)
  • 外键 - 这些都是自动索引,但你应该添加一个到避免出现性能问题时的约束检查

之后,查找其他列经常使用过滤查询:一个典型的例子是人的姓氏。

+0

那么这是不正确的。您可以在不生成索引的情况下自动生成索引 - 通过指定要使用的现有索引。 – 2008-10-17 17:23:22

+0

公平点 - 我已更新我的文本 – 2008-10-20 17:59:19

0

通常会将ID列放在前面,这些列通常会唯一标识行。列的组合也可以做同样的事情。作为一个使用汽车的例子......标签或牌照是独一无二的,并有资格获得索引。他们(标签列)可以有资格获得主键。如果您要搜索名称,则所有者名称可以有资格获得索引。汽车制造商一开始不应该得到一个指数,因为它不会变化太大。如果列中的数据变化不大,索引不起作用。

看看SQL - where子句在看什么。那些可能需要一个索引。

措施。什么是问题 - 页面/查询耗时过长?什么是用于查询。在这些列上创建一个索引。

注意事项:索引需要时间进行更新和空间。

有时全表扫描比索引更快。小表可以比获取索引然后敲击表更快地被扫描。看看你的加入。

1

研究数据库规范化 - 您会发现许多关于应该存在哪些密钥,数据库应如何关联以及索引提示的行业标准规则。

- 亚当

4

从10g的Oracle数据库应用程序开发人员指南 - 基础,第5章:

在一般情况下,你应该在任何下列情形之一的创建一个列的索引:

  • 该列经常被查询。
  • 列上存在参照完整性约束。
  • 列上存在唯一键完整性约束。

使用以下准则确定何时创建索引:

  • 创建索引,如果你经常需要在一个大表检索比列的15%左右。然而,根据表扫描的相对速度以及行数据关于索引键的聚集方式,此阈值百分比变化很大。表扫描越快,百分比越低;行数据越集中,百分比越高。
  • 用于连接以提高连接性能的索引列。
  • 唯一性主键自动具有索引,但你可能要创建一个外键的索引;有关更多信息,请参见第6章“在应用程序开发中维护数据完整性”。
  • 小表不需要索引;如果查询时间过长,那么表格可能会从小到大。

一些列索引强有力的候选人。具有以下一个或多个特征的列是建立索引的好候选者:

  • 值在列中是唯一的,或者重复项很少。
  • 有很多值(对常规索引有好处)。
  • 有一个小的范围的值(好位图索引)。
  • 列包含许多空值,但是查询常常选择具有值的所有行。在这种情况下,所有的非空值,如匹配的比较:

    WHERE COL_X> = -9.99 *功率(10125) 优选 WHERE COL_X IS NOT NULL

    这是因为第一个使用COL_X上的索引(假设COL_X是数字列)。

列具有以下特点不太适合索引:

  • 有在列许多空,你不要在非空值进行搜索。
+0

说 >这是很危险的。有一小部分值(适用于位图索引)。 这将每隔一段时间搞砸一个OLTP数据库。 – 2008-10-17 17:26:53

2

哇,这只是一个如此巨大的话题,很难用这种格式来回答。我强烈建议这个book

关系数据库索引设计和优化器通过 塔皮奥Lahdenmaki

你不只是使用索引,使表的访问速度更快,有时你制作索引完全避免表的访问。还没有提到的东西,但至关重要。

有一个整体科学这一点,如果你真的想使你的数据库最大执行。

啊,甲骨文一个具体的优化是建立反向键索引。如果你的PK索引是一个monoatomically增加值,就像一个序列一样,并且你有高度并发的插入,并且不打算对该列进行范围扫描,那么把它作为反向索引。

看看这些优化可以有多特殊?