SQL各种写法的效率问题(转)

本文探讨了多种SQL实现方式的效率对比,包括数据插入、赋值、条件判断等方面,并分析了不同写法背后的执行逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经常可以遇到这种情况:用不同的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')  
   
  _________________________________  
  上面两种方法,哪种方法效率高?  
   
   
  根据我的认识,第二种方式效率会高些。因为union运算本身会做一个向中间表插入的操作。所以每一种方式执行步骤为:   执行完多个union操作,再执行多条数据插入操作  
  第二的方式只执行了多条数据插入操作,所以效率较高  
  (2)赋值时:  
   
  SELECT   @a=N'aa'  
  SET   @a=N'aa'  
  _________________________________  
  上面两种方法,哪种方法效率高?  
   
  感觉一样,只不过select可以多个变量同时赋值  
   
   
  (3)取前几条数据时  
  set   ROWCOUNT   2   select   *   from   tb   order   by   fd  
  select   Top   2   *   from   tb   order   by   fd  
  _________________________________  
  上面两种方法,哪种方法效率高?  
   
  我的看法是第二种效率较高,意思比较明确。记得好像是官方推荐的用法。   我对第一种方式的理解是:先写语句告诉引擎以后的语句我只要两条结果。之后又执行了select语句。微软有没有对这种情况做优化我不得而知。但select   top   2   微软肯定做了优化,所以一点可以肯定第二种方工的效率肯定不会比第一句低  
   
  (4)条件判断时  
    where   0<(select   count(*)   from   tb   where   ……)  
    where   exists(select   *   from   tb   where   ……)    
  _________________________________  
  上面两种方法,哪种方法效率高?  
   
  第二种会好些。exists一旦获取一条符合条件的结果便返回结果true,只有结果为false的时候才会扫描整个表。而第一种则无论表中记录状况如何都需对整个表进行扫描。  
   
  (5)NULLIF的使用----->同理它的反函数ISNULL的使用  
  update   tb   set   fd=case   when   fd=1   then   null   else   fd   end  
  update   tb   set   fd=nullif(fd,1)  
  _________________________________  
  上面两种方法,哪种方法效率高?  
   
  语句好像书解有误??    
  如果语句是这样的话:  
  update   tb   set   fd=case   when   fd   is   null   then   1   else   fd   end  
  update   tb   set   fd=isnull(fd,1)  
   
  感觉效率差不多,有机会测试下  
   
  (6)从字符串中取子字符串时  
  substring('abcdefg',1,3)  
  left('abcderg',3)_  
  ________________________________  
  上面两种方法,哪种方法效率高?  
   
  left更专业些有优势吧  
   
  (7)EXCEPT和Not   in的区别?  
   
  except没用过,感觉应该一样,都需要做逐行扫描,性能都比较低~~  
   
  (8)INTERSECT和UNION的区别?  
   
  intersect没用过没有发言权  
   
   
  以上这些答案完全凭经验,没有经过测试,如有错误欢迎指出....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值