在Oracle 10G中,有没有一种方法可以告诉CBO,它永远不应该考虑/拒绝特定的执行计划(如果我们知道PLAN Hash值,并且我们知道给定的计划总是会引发性能问题)。
同样,有没有办法告诉它一系列好用的计划?
发布于 2013-10-23 17:02:38
你不能“拒绝”特定的执行计划。但是您可以使用“存储大纲”来“强制执行”特定的执行计划。您只需让Oracle创建一组提示,这些提示将强制执行特定exec计划。但这应该被认为是最后的解决方案。这些概述有几个陷阱,比如
中硬编码的SQL中,则可能需要强制执行登录触发器。
正确的索引、分区、动态采样或锁定表统计信息通常是更好的解决方案。
另外,如果您没有AWR的许可证,您仍然可以使用它的前身STATSPACK。如果您定期收集STATSPACK统计信息,则可以获得查询exec计划的历史记录,包括每个“历史”exec计划每次执行的平均buffer gets和disk reads。
发布于 2013-10-23 12:12:39
使用“提示”来修改执行计划。有很多关于提示的信息,但我的经验是,CBO是动态的,而提示,一旦加入,性能总是相同的(如果数据发生重大变化,这是危险的,因为它们可能会长期降低性能)
以下是一个提示的示例:
select /*+ index(scott.emp,dept_idx) */ * from emp在这里您可以了解更多关于它们的信息:http://docs.oracle.com/cd/B19306_01/server.102/b14211/hintsref.htm
根据我的经验,提示极大地增加了复杂SQL查询的运行时间。
https://stackoverflow.com/questions/19532379
复制相似问题