Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何选择和优化oracle索引?_Oracle_Optimization_Indexing - Fatal编程技术网

如何选择和优化oracle索引?

如何选择和优化oracle索引?,oracle,optimization,indexing,Oracle,Optimization,Indexing,我想知道是否有创建索引的一般规则。 如何选择应包含在此索引中的字段,或何时不包含这些字段 我知道这总是取决于环境和数据量,但我想知道我们是否可以制定一些全球公认的关于在Oracle中建立索引的规则。有些事情你应该始终建立索引: 主键-自动为它们提供索引(除非您指定了适合Oracle使用的现有索引) 唯一键-自动为这些键提供索引(同上) 外键-这些外键不是自动索引的,但您应该添加一个,以避免在检查约束时出现性能问题 然后,查找其他经常用于过滤查询的列::一个典型的例子是人们的姓氏。通常将ID列

我想知道是否有创建索引的一般规则。 如何选择应包含在此索引中的字段,或何时不包含这些字段


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

有些事情你应该始终建立索引:

  • 主键-自动为它们提供索引(除非您指定了适合Oracle使用的现有索引)
  • 唯一键-自动为这些键提供索引(同上)
  • 外键-这些外键不是自动索引的,但您应该添加一个,以避免在检查约束时出现性能问题

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

通常将ID列放在前面,这些列通常唯一地标识行。列的组合也可以做同样的事情。以汽车为例。。。标签或车牌是唯一的,符合索引要求。它们(标记列)可以符合主键的条件。如果要搜索名称,则所有者名称可以符合索引的条件。“汽车品牌”一开始不应该得到一个指数,因为它不会有太大的变化。如果列中的数据变化不大,索引就没有帮助

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

量。问题是什么-页面/查询花费的时间太长?用于查询的内容。在这些列上创建索引

警告:索引需要时间进行更新和空间


有时,全表扫描比索引更快。扫描小表比获取索引然后点击表更快。查看您的连接。

查看数据库规范化-您将发现许多关于应该存在哪些键、数据库应该如何关联以及索引提示的良好行业标准规则


-Adam

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

通常,在下列任何情况下,都应在列上创建索引:

  • 该列经常被查询
  • 列上存在引用完整性约束
  • 列上存在唯一的键完整性约束
使用以下准则确定何时创建索引:

  • 如果您经常希望检索大表中少于15%的行,请创建索引。然而,根据表扫描的相对速度以及行数据关于索引键的聚集程度,该阈值百分比变化很大。表格扫描速度越快,百分比越低;行数据越聚集,百分比越高
  • 索引用于联接的列以提高联接性能
  • 主键和唯一键自动具有索引,但您可能希望在外键上创建索引;有关更多信息,请参阅第6章“在应用程序开发中维护数据完整性”
  • 小表不需要索引;如果查询花费的时间太长,那么表可能会从小变大
有些列很适合索引。具有以下一个或多个特征的列是很好的索引候选列:

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

    其中COL_X>=-9.99*功率(10125) 比 其中COL_X不为空

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

具有以下特征的列不太适合编制索引:

  • 列中有许多空值,您不搜索非空值

    • 哇,这是一个如此庞大的话题,很难用这种形式回答。我极力推荐这个

      关系数据库索引设计与优化器 Tapio Lahdenmaki

      您不仅使用索引来加快表访问速度,有时还使用索引来避免表访问。尚未提及但至关重要的事情

      如果你真的想让你的数据库发挥最大的性能,这是一门完整的科学

      啊,Oracle的一个特定优化是构建反向键索引。如果您有一个单原子递增值的PK索引,比如序列,并且您有高度并发的插入,并且不打算对该列进行范围扫描,那么将其设置为反向键索引


      看看这些优化有多具体

      Oracle文档在索引选择方面有一套非常好的注意事项:

      19c的更新:

      引述:

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

      • 考虑在SQL语句中经常用于联接表的索引键。有关优化联接的更多信息,请参阅“使用哈希群集提高性能”一节

      • 选择具有高选择性的索引键。索引的选择性是表中具有相同索引键值的行的百分比。如果有几行具有相同的值,则索引的选择性是最佳的。注意:Oracle会自动对使用完整性约束定义的唯一键和主键的键和表达式创建索引或使用现有索引。 如果数据分布发生倾斜,使一个或多个列