oracle - 如何选择和优化oracle索引?

标签 oracle optimization indexing

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

6年前关闭。




Improve this question




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

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

最佳答案

Oracle 文档有一组出色的索引选择注意事项:http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004
19c 更新:https://docs.oracle.com/en/database/oracle/oracle-database/19/tgdba/designing-and-developing-for-performance.html#GUID-99A7FD1B-CEFD-4E91-9486-2CBBFC2B7A1D
报价:

  • 考虑在 WHERE 子句中经常使用的索引键。
  • 考虑在 SQL 语句中经常用于连接表的索引键。有关优化连接的更多信息,请参阅“使用哈希集群提高性能”部分。
  • 选择具有高选择性的索引键。索引的选择性是表中具有相同索引键值的行的百分比。如果少数行具有相同的值,则索引的选择性是最佳的。注意:Oracle 会在您使用完整性约束定义的唯一键和主键的键和表达式上自动创建索引或使用现有索引。
    如果数据分布偏斜,以至于一两个值的出现频率远低于其他值,则索引低选择性列会很有帮助。
  • 不要在具有很少不同值的键或表达式上使用标准 B 树索引。此类键或表达式通常具有较差的选择性,因此不会优化性能,除非经常选择的键值出现的频率低于其他键值。在这种情况下,您可以有效地使用位图索引,除非索引被频繁修改,例如在高并发 OLTP 应用程序中。
  • 不要索引经常修改的列。修改索引列的 UPDATE 语句以及修改索引表的 INSERT 和 DELETE 语句比没有索引时花费的时间更长。此类 SQL 语句必须修改索引中的数据以及表中的数据。它们还会生成额外的撤消和重做。
  • 不要索引仅出现在带有函数或运算符的 WHERE 子句中的键。使用除 MIN 或 MAX 之外的函数或具有索引键的运算符的 WHERE 子句不会使使用索引的访问路径可用,但基于函数的索引除外。
  • 在大量并发 INSERT、UPDATE 和 DELETE 语句访问父表和子表的情况下,请考虑为参照完整性约束的外键编制索引。这样的索引允许对父表进行 UPDATE 和 DELETE 操作,而无需共享锁定子表。
  • 在选择索引键时,请考虑查询的性能增益是否值得 INSERT、UPDATE 和 DELETE 的性能损失以及存储索引所需空间的使用。您可能希望通过比较带和不带索引的 SQL 语句的处理时间来进行试验。您可以使用 SQL 跟踪工具测量处理时间。
  • 关于oracle - 如何选择和优化oracle索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/212264/

    相关文章:

    c++ - 一个空的类会被优化掉吗

    C++ : Can the compiler optimize this code segment?

    java - 是否优化过一次使用的变量定义?

    MongoDB 使用错误的索引

    python - pandas.DatetimeIndex 频率为 None 且无法设置

    java - Hibernate 和存储过程

    mysql - sql中的不同表可以使用相同的外键吗

    oracle - Oracle 和 Hibernate 中的 generatedValue 不起作用

    python - 如何找到列表中除 NaN 之外的最后一个有效索引

    java - 我应该如何为具有 LDAP 和两个 LDAP 服务器的 Oracle 编写 JDBC url?