SQL各种写法的效率问题

来源:互联网 发布:测试英语水平的软件 编辑:程序博客网 时间:2024/05/17 04:33
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

经常可以遇到这种情况:用不同的SQL写法可以达到同样的目的。爱钻牛角尖的人就想搞明白,诚然结果一样,但到底孰优孰劣?下面是我列出的一些,请兄弟们赐教。也请兄弟们将你们遇到的类似问题一并列出。

(1)一次插入多条数据时:
CREATETABLEtb(IDint,名称NVARCHAR(30),备注NVARCHAR(1000))
INSERTtb  SELECT1,'DDD',1
UNION ALL       SELECT1,'5100','D'
UNION ALL       SELECT1,'5200','E'

也可以这样:
CREATETABLEtb1(IDint,名称NVARCHAR(30),备注NVARCHAR(1000))
INSERTTB1(ID,名称,备注)VALUES(1,'DDD',1)
INSERTTB1(ID,名称,备注)VALUES(1,'5100','D')
INSERTTB1(ID,名称,备注)VALUES(1,'5200','E')
_________________________________
上面两种方法,哪种方法效率高?

(2)赋值时:
SELECT@a=N'aa'
SET@a=N'aa'
_________________________________
上面两种方法,哪种方法效率高?

(3)取前几条数据时
setROWCOUNT2select*fromtborderbyfd
selectTop2*fromtborderbyfd
_________________________________
上面两种方法,哪种方法效率高?

(4)条件判断时
 where0<(selectcount(*)fromtbwhere……)
 whereexists(select*fromtbwhere……)
_________________________________
上面两种方法,哪种方法效率高?

(5)NULLIF的使用----->同理它的反函数ISNULL的使用
updatetbsetfd=casewhenfd=1thennullelsefdend
updatetbsetfd=nullif(fd,1)
_________________________________
上面两种方法,哪种方法效率高?

(6)从字符串中取子字符串时
substring('abcdefg',1,3)
left('abcderg',3)_
________________________________
上面两种方法,哪种方法效率高?

(7)EXCEPT和Notin的区别?

(8)INTERSECT和UNION的区别?
下面是邹老大的回答:

'http://blog.knowsky.com
(1)一次插入多条数据时:

第1种好一些,但也得有个,因为第1种的unionall是做为一个语句整体,查询优化器会尝试做优化,同时,也要先算出这个结果再插入的.


2.如果是单个赋值,没有什么好比较的话.
不过,如果是为多个变量赋值,我测试过,SELECT一次性赋值,比用SET逐个赋值效率好.


3.SETROWCOUNT和TOP是一样的,包括执行的计划等都是一样的

4.这个一般是exists快,当然,具体还要看你后面的子查询的条件,是否会引用外层查询中的对象的列.
  exists检查到有值就返回,而且不返回结果集,count需要统计出所有满足条件的,再返回一个结果集,所以一般情况下exists快.

5.应该是一样的


6.基本上是一样的

7.except会去重复,notin不会(除非你在select中显式指定)
  except用于比较的列是所有列,除非写子查询限制列,notin没有这种情况
8.intersect是两个查询都有的非重复值(交集),union是两个查询结果的所有不重复值(并集)


<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击