Oracle 10G中是否有办法告诉CBO它应该永远不会考虑/拒绝特定的执行计划(如果我们知道计划哈希值并且我们知道给定的计划总是会引发性能问题)。
同样,有没有办法告诉它一个好用的计划清单?
答案 0 :(得分:1)
您不能“拒绝”特定的执行计划。但您可以“强制执行”特定的执行计划,但使用“存储的大纲”。只需让Oracle创建一组提示,这些提示将强制执行特定的执行计划。但这应该被视为最后的解决方案。这些大纲有几个问题,如
应在每次修补后重新生成
他们可能需要强制执行LOGON TRIGGER如果你不能将它们嵌入到在封闭源应用程序中硬编码的SQL中
正确的索引,分区,动态采样或锁定表统计信息通常是更好的解决方案。
另外,如果您没有AWR许可证,您仍然可以使用它的前身STATSPACK。如果您定期收集STATSPACK统计信息,您可以获取查询执行计划的历史记录,包括每个“历史”执行计划的每次执行的平均buffer gets
和disk reads
。
答案 1 :(得分:0)
使用“提示”更改执行计划。有很多关于提示的信息,但我的经验是,CBO是动态的,而提示,一旦它们进入,性能将始终是相同的(如果数据发生显着变化则会很危险,因为它们会降低性能。长期运行)
以下是一个提示示例:
select /*+ index(scott.emp,dept_idx) */ * from emp
您可以在此处了解有关它们的更多信息:http://docs.oracle.com/cd/B19306_01/server.102/b14211/hintsref.htm
根据我的经验,我遇到过Hints大大增加了复杂SQL查询的运行时间的情况。