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是两个查询结果的所有不重复值(并集)

转载于:https://www.cnblogs.com/janisbone/archive/2008/07/23/1249315.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值