今天在做一个统计功能时,写了一个存储过程,该存储过程就是接受两个日期型参数,返回一个统计后的数据集,在存储过程中使用了两个表的联合查询,写完后,用exec运行了下,速度很慢,经过调查后,我把其中一个表中的GUID列加了一个聚集索引,然后针对这个表重建了下索引,然后再用exec跑了下该存储过程,结果快多了,一秒钟即可,以前的话需要17秒,后来我发现逻辑不对,就又在where子句后加了一个条件,然后再用exec跑了下该存储过程,结果又需要17秒钟了,然后我就又针对该表重建了下索引(使用DBCC),然后再用exec跑了下该存储过程,结果1秒钟就出来了,然后我又改了下where子句,结果跑一次又需要17秒钟了,然后重建索引又好了现在就是感觉只要动一下那个存储过程的where子句,哪怕是在后面加一个 " and 1=1",然后跑起来就N慢,需要17秒,必须得重建索引才行,索引重建后跑一次只需要1秒请问哪位有数据库优化经验的高手能给个说法这是为什么吗,给个参考也行 谢谢
你改了语句当然要重新编译啦.(很大可能)
where 后面尽量将主键、聚簇索引、非聚簇索引放在左边,一旦将 1=1 放在了最左边,索引将不会起作用的
改动前:select xxx from mmmm where WorkInsGUID='F9E01CD7-6E62-42B7-9423-6D9067D75736',重建索引后 查询效率:1秒
然后改成:select xxx from mmmm where WorkInsGUID='F9E01CD7-6E62-42B7-9423-6D9067D75736' and 1=1 查询效率:17秒,必须重建mmmm表的索引后,查询效率又恢复到1秒这是为什么呢,我仅仅只是加了一个"1=1"的查询条件啊,根本就没动mmmm表的索引啊
2.你动态拼接WHERE 是传参数进去的还是里面去写好的?如果你没弄好.可能重新编译.或者重新使用执行计划不准确.
2.where的条件是传参数进去的
2我问的意思是 AND 1=1 是你直接传进去的?
and 1=1 是我在动态sql里写死的