【问题标题】:Using Index in oracle在 oracle 中使用索引
【发布时间】:2009-11-20 11:57:02
【问题描述】:

如何在 oracle 的选择查询中使用索引?什么时候创建索引可以提高性能?

如何显式使用索引?

【问题讨论】:

    标签: oracle indexing


    【解决方案1】:

    您无需执行任何操作即可在选择查询中使用索引 - Oracle 将决定哪种索引(如果有)最有助于执行查询。索引通过提供您想要的数据的快捷方式来帮助某些查询(不是全部)的性能。您应该阅读Oracle Concepts Guide 中的索引 - 阅读标题为“索引概述”的部分。

    【讨论】:

      【解决方案2】:

      如果 oracle 提出了错误的执行计划,而您真的必须告诉它要使用哪个索引(这种情况很少发生,但确实会发生),您可以使用优化器提示:

      SELECT /*+ INDEX(mytable myindex) */ foobar from mytable
      

      但这应该是你最后的手段。在您尝试这样做之前,请使用

      execute dbms_stats.gather_table_stats('myschema','mytable')
      

      告诉Oracle分析表;希望它会找出何时以这种方式使用索引。

      【讨论】:

      • 根据数据库版本和某些参数设置,对DBMS_STATS.GATHER_TABLE_STATS 的调用可能不会自动收集索引统计信息。在这种情况下,我们需要使用DBMS_STATS.GATHER_INDEX_STATS 或显式设置CASCADE 参数:execute dbms_stats.gather_table_stats('myschema','mytable', cascade=>TRUE)
      【解决方案3】:

      通常,您无需在查询中说明任何内容即可使用索引。 Oracle 的计划评估器将(希望)为您选择执行该查询的最佳方式。这是 Codd 对关系数据库的原则之一。

      什么时候创建索引可以提高性能?

      几个场景。其中一些:

      1. 当您尝试搜索条件时(即:select * from foo where field = 121,如果您的表很大并且您在 field 上有索引,这会有所帮助)
      2. 当您想要对结果进行排序时。 (即:select * from foo order by field,如果您的表很大并且您在 field 上有索引,这将有所帮助)
      3. 执行联接时

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        • 2021-03-09
        • 2011-04-16
        相关资源
        最近更新 更多