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