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')
_________________________________
上面两种方法 , 哪种方法效率高 ?
答:
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 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 end
update 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值