Oracle如何计算解释计划中的成本?

Gau*_*oni 0 oracle performance oracle10g oracle11g query-tuning

任何人都可以解释如何在Oracle解释计划中评估成本吗?是否有任何特定的算法来确定查询的成本?

例如:全表扫描,具有较高的性价比,索引扫描下... Oracle如何评估情况的 full table scan,index range scan等等?

此链接与我要求的相同:关于Oracle解释计划中的成本的问题

但是,任何人都可以用一个例子来解释,我们可以通过执行找到成本explain plan,但它如何在内部工作?

Jus*_*ave 6

有许多用于计算成本的特定算法.远不止这里可以实际讨论.Jonathan Lewis在他的" 基于成本的Oracle基础知识"一书中介绍了基于成本的优化器如何决定查询成本方面所做的令人钦佩的工作.如果你真的感兴趣,这将是最好的起点.

假设全表扫描的成本高于索引扫描,这是一种谬误.它取决于优化器对表中行数的估计以及优化器对查询将返回的行数的估计(反过来,这取决于优化器对各种谓词的选择性的估计),相对成本顺序读取与串行读取,处理器的速度,磁盘的速度,缓冲区缓存中块的可用概率,数据库的优化器设置,会话的优化器设置,PARALLEL表的属性和索引,以及一大堆其他因素(这就是为什么它需要一本书真正开始潜入这种事情).通常,如果您的查询将返回表中的大部分行,并且如果查询将返回表中的一小部分行,则Oracle将更喜欢全表扫描.并且"小部分"通常比人们最初估计的要小得多 - 例如,如果您返回表中20-25%的行,例如,使用全表扫描几乎总是更好.

如果您尝试COST在查询计划中使用该列来确定计划是"好"还是"坏",那么您可能会走错路.该COST如果优化的估计是准确的才有效.但查询计划不正确的最常见原因是优化程序的估计不正确(统计信息不正确,Oracle对选择性的估计不正确等).这意味着如果您看到一个成本为6的查询计划和一个成本为600万的该查询的不同版本的计划,那么成本为600万的计划完全有可能是更高效,因为低成本的计划错误地假设某些步骤将返回1行而不是100万行.

无视COST列并专注于色谱柱,您会得到更好的服务CARDINALITY. CARDINALITY是优化程序对计划每一步将返回的行数的估计. CARDINALITY是你可以直接测试和比较的东西.例如,如果你看到计划中的一个步骤涉及没有谓词的表A的完整扫描,并且你知道A有大约100,000行,那么如果优化器的CARDINALITY估计值太高或者太低,那将会有些问题. .如果它将基数估计为100或10,000,000,那么优化器几乎肯定要么错误地选择表扫描,要么将该数据提供给后来的步骤,其中成本估计将非常不正确,导致它选择不良的连接顺序或一种糟糕的连接方法.它可能表明表A的统计数据不正确.另一方面,如果您发现每个步骤的基数估计值与现实相当接近,那么Oracle很有可能为查询选择了一个相当不错的计划.