2013-01-01 81 views
0

场景:SQL解释计划Intrepretation - Oracle数据库

我得到(对于成本,字节和基数选项卡访问完整和同号)两个不同的查询在同一个表(不一样的解释计划索引/无PK /无FK)。

查询1:

select * from tab1 where col1 = 'A' 

QUERY2:

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

问:

不会QUERY2附加条件需要更多的时间来处理?

有类似之处,甚至查询1花费的时间为QUERY2,这是需要对表(表访问全文)几乎任何此类查询最大时间的?

请注意,表(数据卷总是< 0.5 mil)到目前为止没有显示任何性能问题,这只是为了解释oracle COB提供的解释计划,以便它对未来的增强有利。

回答

3

你说你的桌子上没有索引。因此优化器别无选择,只能进行全面扫描。另外,您正在选择所有列(select *)。查询2(主要是全扫描的IO)的成本将非常相似,可能是额外条件下的极小的额外CPU。基数是优化程序估计将由查询计划的每个步骤检索的行数。同样,字节数是预期的字节数。如果您的查询1和查询2返回的行数相同,即额外的谓词不影响结果,那么基数和字节计数对于查询1与查询2相同。如果你认为他们应该有所不同,那么你应该检查你的表统计是最新的。

+0

您的回复很有道理。根据你的回答,我有两个问题 - 1.你说'微不足道的额外的CPU' - 即使它很小,它怎么能被测量?如果我的表将要有更多的行,并且查询具有相同的C-B-C解释计划,那么误导用户关于这两个查询上的被重新搜索的行将具有相同的性能,对吧?我想这不是这种情况。请解释。 2.也请解释你在上述答案中的基数是什么意思,因为我把它当作'不'。 '不同'行'。 – Lakshman

+0

请忽略上述评论中的第二个问题。下面的堆栈溢出[链接](http://stackoverflow.com/questions/13838173/how-to-consider-explain-plan-as-good-oracle-10g?rq=1)帮助我的术语深入了解oracle的解释计划功能。 – Lakshman

+1

在查询计划中可以看到使用的CPU数量(以每个查询步骤的总成本的百分比表示)。与IO的成本相比,这可能非常小或者四舍五入。如果您在选择列表中包含一些精心设计的计算,则可能会看到CPU%增加。 “基数”是query = row count = num rows,每一步的结果集的est大小。请记住,查询计划是一种估算,因此根据统计数字,数字将近似正确。如果您需要确切值,则需要跟踪查询并使用例如TKProf查看究竟发生了什么。 –