SQL各种写法的效率问题

问:

(1)一次插入多条数据时:

CREATE TABLE tb(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))

INSERT tb SELECT 1,'DDD',1

<place w:st="on"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green">UNION</span></place> ALL SELECT 1,'5100','D'

<place w:st="on"><span lang="EN-US" style="FONT-SIZE: 9pt; COLOR: green">UNION</span></place> 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 fd

select Top 2 * from tb order by fd

_________________________________

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

答:

SET ROWCOUNTTOP 是一样的, 包括执行的计划等都是一样的

问:

(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 end

update tb set fd=nullif(fd,1)

_________________________________

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

答:

应该是一样的

问:

6)从字符串中取子字符串时

substring('abcdefg',1,3)

left('abcderg',3)_

________________________________

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

答:

基本上是一样的

问:

(7)EXCEPTNot in的区别?

答:

except会去重复, not in 不会(除非你在select中显式指定)

except用于比较的列是所有列, 除非写子查询限制列, not in 没有这种情况

问:

(8)INTERSECTUNION的区别?

答:

intersect是两个查询都有的非重复值(交集), union是两个查询结果的所有不重复值(并集)

CSDN上对应的帖子

http://community.csdn.net/Expert/topic/4867/4867641.xml?temp=.8817865

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值