转贴几个有意思的SQL问题,并给出我的理解

问题原贴地址:http://community.csdn.net/Expert/topic/4867/4867641.xml?temp=6.649196E-03

经常可以遇到这种情况:用不同的SQL写法可以达到同样的目的。爱钻牛角尖的人就想搞明白,诚然结果一样,但到底孰优孰劣?下面是我列出的一些,请兄弟们赐教。也请兄弟们将你们遇到的类似问题一并列出。

(1)一次插入多条数据时:
CREATE TABLE tb(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))
INSERT tb   SELECT 1,'DDD',1
UNION  ALL        SELECT 1,'5100','D'
UNION  ALL        SELECT 1,'5200','E'

也可以这样:
CREATE TABLE tb1(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))
INSERT TB1 (ID,名称,备注)VALUES(1,'DDD',1)
INSERT TB1 (ID,名称,备注)VALUES(1,'5100','D')
INSERT TB1 (ID,名称,备注)VALUES(1,'5200','E')

_________________________________
上面两种方法,哪种方法效率高?


根据我的认识,第二种方式效率会高些。因为union运算本身会做一个向中间表插入的操作。所以每一种方式执行步骤为: 执行完多个union操作,再执行多条数据插入操作
第二的方式只执行了多条数据插入操作,所以效率较高
(2)赋值时:

SELECT @a=N'aa'
SET @a=N'aa'
_________________________________
上面两种方法,哪种方法效率高?

感觉一样,只不过select可以多个变量同时赋值

(3)取前几条数据时
set ROWCOUNT 2 select * from tb order by fd
select Top 2 * from tb order by fd
_________________________________
上面两种方法,哪种方法效率高?

我的看法是第二种效率较高,意思比较明确。记得好像是官方推荐的用法。 我对第一种方式的理解是:先写语句告诉引擎以后的语句我只要两条结果。之后又执行了select语句。微软有没有对这种情况做优化我不得而知。但select top 2 微软肯定做了优化,所以一点可以肯定第二种方工的效率肯定不会比第一句低

(4)条件判断时
 where 0<(select count(*) from tb where ……)
 where exists(select * from tb where ……)
_________________________________
上面两种方法,哪种方法效率高?

第二种会好些。exists一旦获取一条符合条件的结果便返回结果true,只有结果为false的时候才会扫描整个表。而第一种则无论表中记录状况如何都需对整个表进行扫描。

(5)NULLIF的使用----->同理它的反函数ISNULL的使用
update tb set fd=case when fd=1 then null else fd end
update tb set fd=nullif(fd,1)
_________________________________
上面两种方法,哪种方法效率高?

语句好像书解有误??
如果语句是这样的话:
update tb set fd=case when fd is null then 1 else fd end
update tb set fd=isnull(fd,1)

感觉效率差不多,有机会测试下

(6)从字符串中取子字符串时
substring('abcdefg',1,3)
left('abcderg',3)_
________________________________
上面两种方法,哪种方法效率高?

left更专业些有优势吧

(7)EXCEPT和Not in的区别?

except没用过,感觉应该一样,都需要做逐行扫描,性能都比较低~~

(8)INTERSECT和UNION的区别?

intersect没用过没有发言权


以上这些答案完全凭经验,没有经过测试,如有错误欢迎指出....

posted on 2006-12-23 00:05  李永刚  阅读(590)  评论(6编辑  收藏  举报