您的位置:首页 > 数据库

SQL各种写法的效率问题

2008-01-03 14:55 225 查看
问:(1)一次插入多条数据时:CREATE TABLE tb(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))INSERT tb   SELECT 1,'DDD',1UNION  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')_________________________________上面两种方法,哪种方法效率高?答:第1种好一些, 但也得有个量的控制, 因为第1种的union all是作为一个语句整体, 查询优化器会尝试做优化, 同时, 也要先算出这个结果再插入的.  问:(2)赋值时:SELECT @a=N'aa'SET @a=N'aa'_________________________________上面两种方法,哪种方法效率高?答:如果是单个赋值, 没有什么好比较的话.不过, 如果是为多个变量赋值, 经测试, SELECT 一次性赋值, 比用SET 逐个赋值效率好..  问:(3)取前几条数据时set ROWCOUNT 2 select * from tb order by fdselect Top 2 * from tb order by fd_________________________________上面两种方法,哪种方法效率高?答:SET ROWCOUNT和TOP 是一样的, 包括执行的计划等都是一样的  问:(4)条件判断时 where 0<(select count(*) from tb where ……) where exists(select * from tb where ……) _________________________________上面两种方法,哪种方法效率高?答:这个一般是exists快, 当然, 具体还要看你后面的子查询的条件, 是否会引用外层查询中的对象的列.exists检查到有值就返回, 而且不返回结果集, count需要统计出所有满足条件的, 再返回一个结果集, 所以一般情况下exists快.  问:(5)NULLIF的使用----->同理它的反函数ISNULL的使用update tb set fd=case when fd=1 then null else fd endupdate tb set fd=nullif(fd,1)_________________________________上面两种方法,哪种方法效率高?答:应该是一样的  问:6)从字符串中取子字符串时substring('abcdefg',1,3)left('abcderg',3)_________________________________上面两种方法,哪种方法效率高?答:基本上是一样的  问:(7)EXCEPT和Not in的区别?答:except会去重复, not in 不会(除非你在select中显式指定)except用于比较的列是所有列, 除非写子查询限制列, not in 没有这种情况  问:(8)INTERSECT和UNION的区别?答:intersect是两个查询都有的非重复值(交集), union是两个查询结果的所有不重复值(并集) CSDN上对应的帖子http://community.csdn.net/Expert/topic/4867/4867641.xml?temp=.8817865 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=926622
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: