时常
可以遇到这种状况:用不同的SQL写法
可以达到同样的
目标 。爱钻牛角尖的人就想搞清楚,诚然
后果一样,但到底孰优孰劣?下面是我列出的一些,请兄弟们赐教 。也请兄弟们将你们遇到的
类似问题一并列出 。
(1)一次插入多条数据时:
CREATE TABLE tb(ID int, 名称 NVARCHAR(30), 备注 NVARCHAR(1000))
INSERT tbSELECT 1,'DDD',1
UNIONALLSELECT 1,'5100','D'
UNIONALLSELECT 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')
_________________________________
上面两种
步骤,哪种
步骤效率高?
(2)赋值时:
SELECT @a=N'aa'
SET @a=N'aa'
_________________________________
上面两种
步骤,哪种
步骤效率高?
(3)取前几条数据时
set ROWCOUNT 2 select * from tb order by fd
select Top 2 * from tb order by fd
_________________________________
上面两种
步骤,哪种
步骤效率高?
(4)条件推断时
where 0<(select count(*) from tb where ……)
where exists(select * from tb where ……)
_________________________________
上面两种
步骤,哪种
步骤效率高?
(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的区别?
(8)INTERSECT和UNION的区别?
下面是邹老大的
答复:
'http://blog.knowsky.com
(1)一次插入多条数据时:
第1种好一些, 但也得有个, 由于第1种的union all是做为一个语句整体,
查问优化器会尝试做优化, 同时, 也要先算出这个
后果再插入的.
2. 假如是单个赋值, 没有什么好
比较的话.
不过, 假如是为多个变量赋值, 我测试过, SELECT 一次性赋值, 比用SET 一一赋值效率好.
3. SET ROWCOUNT和TOP 是一样的, 包含执行的
方案等都是一样的
4. 这个普通是exists快, 固然, 具体还要看你后面的子
查问的条件, 是不是会
引用外层
查问中的对象的列.
exists
审查到有值就返回, 并且不返回
后果集, count需求统计出全部满足条件的, 再返回一个
后果集, 所以普通状况下exists快.
5. 应该是一样的
6.
根本上是一样的
7. except会去
反复, not in 不会(除非你在select中显式指定)
except用于
比较的列是全部列, 除非写子
查问
制约列, not in 没有这种状况
8. intersect是两个
查问都有的非
反复值(
交加), union是两个
查问
后果的全部不
反复值(并集)