同样的SQL语句,执行效率却不同,执行计划也不同,望高手指点,谢谢
select fID,fName,fuName,
(select sum(sldQuantity) from shopListDetail,shopList,cash where cBusinessDay>='2010-03-01' and cBusinessDay<='2010-03-31' and sld_slID=slID and sl_cID=cID and sldPresent=0 and sldDisposed<>1 and sld_fID=fID) as saleCount ,
(select sum(sldMoney) from shopListDetail,shopList,cash where cBusinessDay>='2010-03-01' and cBusinessDay<='2010-03-31' and sld_slID=slID and sl_cID=cID and sldPresent=0 and sldDisposed<>1 and sld_fID=fID) as saleMoney ,
(select sum(sldQuantity) from shopListDetail,shopList,cash where cBusinessDay>='2010-03-01' and cBusinessDay<='2010-03-31' and sld_slID=slID and sl_cID=cID and sldPresent=1 and sldDisposed<>1 and sld_fID=fID) as presentCount ,
(select sum(sldMoney) from shopListDetail,shopList,cash where cBusinessDay>='2010-03-01' and cBusinessDay<='2010-03-31' and sld_slID=slID and sl_cID=cID and sldPresent=1 and sldDisposed<>1 and sld_fID=fID) as presentMoney ,
f_countftID from food,foodUnit where f_fuID=fuID and
fID in (select Distinct sld_fID from shopListDetail,shopList,cash where cBusinessDay>='2010-03-01' and cBusinessDay<='2010-03-31' and sld_slID=slID and sl_cID=cID )
order by f_countftID,fID
做一个统计,统计的范围,是3月1日,到3月31日,也就是一个月的数据。
执行这条指令,大概要花60秒左右。
cash表记录数为 9676条
shopList表的记录数为 11657条
shopListDetail表的记录数为 18620条
food表,和foodType表,是商品信息,属于基础数据,记录数也就100多条吧。
只要把开始时间,改为1月1日,到3月31日,统计3个月的数据。
涉及到的数据量,cash表,shopList表,shopListDetail的记录数,都应该翻3位左右。
则查询1秒钟之内就完成了。
最终统计的输出结果,都是正确的。
继续做测试,发现一个很奇怪的想象:
1月1日,到1月31日,效率正常。
2月1日,到2月28日,效率正常。
1月1日,到3月31日,效率正常。
2月1日,到3月31日,效率正常。
2月20日,到3月31日,效率正常。
起始日期于2009年,效率都是正常的。
即使是统计2009年1月1日,到2010年3月31日,统计都会在1秒左右完成。
2月25日,到3月31日,效率低下。 (大概60秒)
2月25日,到3月5日,效率低下。 (大概20秒)
3月10日,到3月20日,效率低下。 (大概20秒)
用查询分析器看了执行计划,《效率低下》,和《效率正常》,执行计划里反映的图表,完全不同。
《效率低下》是一种图表。
《效率正常》则是另一种图表。
俺也不懂,怎么把执行计划搞成数据,发到网上来,希望有高手能指点一下。
俺手里有很多客户的数据库,做测试,永远的《效率正常》的情况。即使统计几年的数据,最多也就2、3秒钟
只有这一个客户的数据库,在特定情况下,会出现《效率低下》的情况。
程序已经投入使用几年了,全部正常,只有这个客户这里,出现了异常。 这个客户的数据量,也不是最大的。
目前,对这个客户,只要把command.CommandTimeout,从缺省的30秒,改为600秒(10分钟),就可以了。 这个统计,也不是经常做。
目前,只有对《3月,或是近期数据》进行统计,可能出现《效率低下》的情况。花费1分多钟,总可以统计出来。
但是,很害怕万一出现统计1年数据时,出现《效率低下》的情况,导致一个统计要花费30分钟、甚至30分钟以上。
而且,今天发现了一条SQL语句出现了问题。
天知道还有哪条SQL语句,会在特定的情况下,出现《效率低下》的问题。
总感觉这是一颗不定时炸弹,天知道他在啥地方,在啥时间会爆。
有没有高手能指点一下???如果需要,俺可以把数据库提供出来。