这与阅读解释计划无关。
这与添加任何提示或测量特定查询的性能无关。
我一直想知道一个给定的查询解释计划(或查询的自动跟踪)是否有可能“询问”优化器为什么选择这个计划而不是其他可用的计划。
- 有没有办法让数据库显示它为同一查询考虑的不同计划的比较?
- 有没有办法查看为计划显示的成本进行了哪些计算?(例如,优化器假设 wrt. 磁盘访问与内存中的东西等。)
这个问题的理由:据我所知,使用 EXPLAIN PLAN,当数据库选择某个执行计划时,这不够/太慢/......在第一时间,DBA 或开发人员并不知道:是否有根本没有这个计划的任何替代方案,而且不知道为什么,如果开发人员知道替代方案(例如未使用的索引),则不会使用这些替代方案。
是的你可以。
这称为跟踪 Oracle 优化器。这样做会创建一个跟踪文件,优化器会在其中转储编写计划时所做的所有推理。
可以在此处找到为特定 SQL 生成跟踪的示例how to trace optimizer for specific SQL system wide - 10053 trace event
您可能需要一些时间来阅读它,考虑到在跟踪中发现的数据量,令人惊讶的是 Oracle 甚至抽出时间来做这件事并在适当的时间返回。
Oracle 的优化器本身就是一门完整的科学。除了 @ik_zelf 之外,您还应该查看 TKPROF,它有助于使 .trc 文件易于阅读。在此处和此处查看Cary Millsap 的书籍(主要是 Oracle trace)。查看 Jonathan Lewis 的书和他的博客有关 Oracle 优化器的很多信息。Lewis 的书有 536 页长(它只叫做 Fundamentals!),他说他要写另一本(还没有出版)。还有一个称为“计划稳定性”(Google it)的概念,如果您对性能感到满意并且不希望优化器“第二次猜测”您,那么您可以修复计划,从而有时会产生次优计划。这个想法似乎是沿着“你知道的魔鬼比你不知道的更好”的思路——也就是说,一个次优的计划比一个_可能_运行出色但冒着搞砸风险的计划更好。如果优化器失控,则可以工作。