创建索引是否应该立即更新 Oracle 的查询计划?

Mar*_*eon 3 oracle indexing oracle10g sql-execution-plan

如果您有一个低效的查询,并且您添加了一个索引来帮助提高性能,那么查询是否应该“立即”开始使用该索引?

或者您是否需要通过运行 来清除 Oracle“缓存”(我相信是 v$sql)alter system flush shared_pool;

Ada*_*sch 5

正如 DBA 喜欢回答的那样,“视情况而定”。

这取决于 Oracle 是否认为索引有助于提高性能。如果 Oracle 认为索引不是查询的最佳选择,那么 Oracle 无论如何都不会使用它。

这取决于您是否使用准备好的语句。准备好的语句在其生命周期内不会重新解析,因此如果正在运行的应用程序使用您要修复的准备好的语句,您将需要重新启动该应用程序。

刷新共享池将强制 Oracle 重新解析和重新优化所有语句(硬解析),因此如果 Oracle 认为索引有助于提高性能,刷新共享池将起作用。但是,它也可能在实时生产系统中产生深远的影响——导致“解析风暴”,因为每个使用中的语句都必须重新解析和重新优化——并且只能作为最后的手段。

  • 因为preparedStatement 是Oracle 中的一个游标,并且Oracle 知道您的应用程序一直持有该游标,直到您关闭preparedStatement 或您的会话结束。通过终止应用程序来结束会话通常是唯一的控制方法。一旦您不持有该游标(在应用程序重新启动后),Oracle 将注意到新索引已使共享池中的语句无效,并重新解析/重新优化该语句。请参阅此处的第 3 页上的流程图​​:http://www.oracle.com/technology/books/pdfs/jdbc_ch5.pdf (4认同)