【问题标题】:SQL Explain Plan Intrepretation - Oracle DBSQL 解释计划解释 - Oracle DB
【发布时间】:2012-12-16 02:01:47
【问题描述】:

场景:

对于同一张表上的两个不同查询(未编入索引/无 PK/无 FK),我得到了相同的解释计划(选项卡访问完整和成本、字节和基数的相同数字)。

查询1:

select * from tab1 where col1 = 'A'

查询2:

select * 
from tab1 
where col1 = 'A' 
and months_between(decode(col2,NULL,col3,col4),col5)<13;

问题:

Query2 中添加的条件不会需要更多时间来处理吗?

是不是这样,即使 Query1 所花费的时间也与 Query2 一样,这几乎是表上任何此类查询所需的最长时间(标签访问已满)?

请注意,该表(数据量始终

【问题讨论】:

    标签: sql oracle plsql sql-execution-plan


    【解决方案1】:

    您说您的表上没有索引。因此,优化器别无选择,只能进行全扫描。此外,您正在选择所有列 (select *)。 query2 的成本(主要是全扫描的 IO)将非常相似,也许是额外条件的微小额外 CPU。基数是优化器估计的查询计划的每个步骤将检索的行数。同样,字节数是预期的字节数。如果您的 query1 和 query2 返回相同数量的行,即额外谓词不会影响结果,则 query1 的基数和字节数将与 query2 相同。如果您认为它们应该不同,那么您应该检查您的表格统计信息是否是最新的。

    【讨论】:

    • 您的回复很有道理。根据您的回复,我有两个问题 - 1. 您说“微不足道的额外 CPU” - 即使它微不足道,如何衡量?如果我的表将有更多行,并且两个查询都具有相同的解释计划和相同的 C-B-C,那么这会误导用户认为两个查询上的检索行具有相同的性能,对吗?我想这里不会是这样。请解释。 2.另外请解释上述答案中的基数是什么意思,因为我的答案是“不”。 '不同'行'。
    • 请忽略上述评论中的第二个问题。以下堆栈溢出link 帮助我深入了解了 oracle 的解释计划功能。
    • 在查询计划中可以看到大约使用的 CPU(占每个查询步骤总成本的百分比)与 IO 成本相比,它可能非常小或四舍五入。如果您要在选择列表中包含一些复杂的计算,您可能会看到 CPU 百分比增加。 “基数”是查询的每个步骤的结果集的估计大小 = 行数 = num 行,同样的事情。请记住,查询计划是一个估计值,因此根据统计数据,数字将是近似正确的。如果您想要准确的值,您需要跟踪查询并使用例如TKProf 看看到底发生了什么。
    • 感谢主。这有帮助。祝你 2013 年快乐 :-)
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2013-02-02
    • 2019-08-12
    • 1970-01-01
    • 2020-10-16
    相关资源
    最近更新 更多