日期:2014-05-17  浏览次数:20559 次

微软自动选择最优的计划吗?

大侠们好,不是说 sqlserver自动选择最优化的方案执行吗?
看下面情况
select * from ta a join tb b on a.c1=b.c1 join tx c on b.c2=c.c2
where a.c3 between '2' and '8'
-- and b.c3 between '2' and '8'
ta(c1,c2,c3) c3上聚集索引
tb(c1,c2,c3) c3上聚集索引 c2上非聚集索引
tx(c2) 无索引
其中 a.c3也 b.c3的内容完全一样对应的。

b与c联接操作时,可能用到c2上的索引,也可能用到条件里的b.c3上 但是我发现sqlserver只要加上了c3列它就会自动用聚集索引,如果数据分布按一定的格式,这样反而更慢了?
这是什么情况必须自己注意吗?如果数据变动了,又有可能加上条件更好。sqlserver不能自动选择最优的方案吗?

------解决方案--------------------
SQL Server是根據查詢的條件和數據量的大小來選擇對應的執行計劃。
------解决方案--------------------
所谓的自动并不是绝对的,不然就不需要出现hints,由于数据量、统计信息、编写的思路等等,都会使得SQLServer选取的所谓的最优执行计划有所偏离甚至选择了一个非常差的执行计划。
------解决方案--------------------
好像是这样的

假如啊,假如:
查找了100个执行计划,耗时1秒
这100个计划中有一个计划的执行时间是1秒
那么,还有必要继续找下去吗
------解决方案--------------------
因为会重用第一次执行的计划 
这种问题确实麻烦 在不同的数据分布下  会使用旧的执行计划 我也很头疼
可以考虑用 recompile
或者  optimize for