【发布时间】:2009-11-20 11:57:02
【问题描述】:
如何在 oracle 的选择查询中使用索引?什么时候创建索引可以提高性能?
如何显式使用索引?
【问题讨论】:
如何在 oracle 的选择查询中使用索引?什么时候创建索引可以提高性能?
如何显式使用索引?
【问题讨论】:
您无需执行任何操作即可在选择查询中使用索引 - Oracle 将决定哪种索引(如果有)最有助于执行查询。索引通过提供您想要的数据的快捷方式来帮助某些查询(不是全部)的性能。您应该阅读Oracle Concepts Guide 中的索引 - 阅读标题为“索引概述”的部分。
【讨论】:
如果 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)
通常,您无需在查询中说明任何内容即可使用索引。 Oracle 的计划评估器将(希望)为您选择执行该查询的最佳方式。这是 Codd 对关系数据库的原则之一。
什么时候创建索引可以提高性能?
几个场景。其中一些:
select * from foo where field = 121,如果您的表很大并且您在 field 上有索引,这会有所帮助)select * from foo order by field,如果您的表很大并且您在 field 上有索引,这将有所帮助)【讨论】: