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

我也来问点基础的问题
最近在优化SQL语句时,碰到一些怪的现象,所以请高手指点一下。
例如下面的简单语句:

select a.id_a, b.id_b, c.id_c
from table_a a, table_b b, table_c c
where a.id_a = b.id_a and b.id_b = c.id_b
and a.lb = '1' and b.lb = '2' and c.lb = '3'


如果语句改成:

select a.id_a, b.id_b, c.id_c
from (select * from table_a where lb = '1') a
, (select * from table_b where lb = '2') b
, (select * from table_c where lb = '3') c
where a.id_a = b.id_a and b.id_b = c.id_b


或是改成:

select a.id_a, b.id_b, c.id_c
from (select id_a from table_a where lb = '1') a
, (select id_a, id_b from table_b where lb = '2') b
, (select id_b, id_c from table_c where lb = '3') c
where a.id_a = b.id_a and b.id_b = c.id_b


假如相关的索引都存在,这三种写法,那种更快一点???
我之前测试过第一种和第三种,有的语句第一种快,有的语句第三种快。

------解决方案--------------------
select 出具体的字段肯定快一点,因为编历少。
如果select 字段一样多,可以说没有什么差别,sql server2008已经自动智能优化了

------解决方案--------------------
#1.第二种和第三种,只是写法不同,可以看成一条语句,无区别。
#2.至于1和3,就你举的例子中的SQL来说,应该也无任何区别,因为执行计划会生成一样的。至于其它的复杂情况,可能会产生不同的执行计划,而产生不同的查询速度。
一切看执行计划,直接讨论哪个快慢,无意义。
------解决方案--------------------
测试结果不稳定的原因很多: 索引情况,索引碎片,数据分布,统计信息,锁定状态..

建议
 1.推荐用第一种写法.
 2.在表名后加(nolock).
 3.注意索引碎片问题.
 4.分析执行计划.
------解决方案--------------------
SQL语句被执行前都会在数据库内优化,这个算法我们是不知道的,所以尽管按照第一种来吧。
楼主不喜欢用 join 吗,那样看起来更清晰易懂。
------解决方案--------------------
复杂的SQL语句,会影响SQL引擎产生执行计划,可能不是最佳的.

建议将大查询拆分成几个步骤来完成(用临时表).