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

写sql语句的2个小疑问
一、记得曾经看过sql语句优化的一些帖子,里面说到一点: 聚集索引条件写在前,非聚集索引条件写在后
语句1正确:where 聚集索引条件 and 非聚集索引条件
语句2错误:where 非聚集索引条件 and 聚集索引条件

我以前发过一个帖子问过类似的问题,当时解答是MSSQL会对where条件进行优化,找出最佳方案再执行。
也就是语句1等效于语句2
而且我看执行计划的时候,确实两个语句分别是50%。

请有经验的大大帮回答一下
聚集索引条件写在前,非聚集索引条件写在后——是否正确


二、避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符,
因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如: 
SELECT id FROM employee WHERE id != 'B%' 
优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

实际应用中,我需要在表中搜索记录集
select * from 表 where 日期>变量开始日期 and 日期<=变量结束日期(注意变量开始日期没有等号)
同样我也问过关于比较日期型时,between and和> <=是否等同,得到的答案是等同

请问到底该是怎么样呢?

如果使用between and的话,就是 日期>=变量开始日期,又不符合搜索条件。

头疼……

------解决方案--------------------
语句1正确:where 聚集索引条件 and 非聚集索引条件
语句2错误:where 非聚集索引条件 and 聚集索引条件

聚集索引条件写在前,非聚集索引条件写在后——是否正确?
======================
我从来没听说过有这么一回事.
聚集索引可理解物理排序,非聚集索引可理解链试排序,一般在数据量比较大情况才考虑索引问题,数据量小,由于有sql的优化,基本不会去考虑

------解决方案--------------------
问题一:MSSQL会对where条件进行优化,找出最佳方案再执行。所以你不必去纠结这个问题了。
问题二:是让尽量避免使用这个关系符,如果避免不了,那还得用。另外,日期的比较,实际比较的是字符串。