Question 7: Can you tell me what the difference of two SQL statements at performance of execution?
Statement 1:
if NOT EXISTS ( select * from publishers where state = 'NY')
begin
SELECT 'Sales force needs to penetrate New York et'
end
else
begin
SELECT 'We have publishers in New York'
end
Statement 2:
if EXISTS ( select * from publishers where state = 'NY')
begin
SELECT 'We have publishers in New York'
end
else
begin
SELECT 'Sales force needs to penetrate New York et'
end关于这两句的区别某人提供的答案是"不同点:执行时的事务数,处理时间,从客户端到服务器端传送的数据量大小"
我做了个实验是给此表添加了594508条记录
其中select * from publishers where state = 'NY'命中42840条一次执行上述两句似乎没有处理时间的不同,数据量也应该是相等的,执行时的事务数该怎么看?
(1 行受影响)SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。(1 行受影响)SQL Server 执行时间:
   CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
     

解决方案 »

  1.   

    习惯上来说,
    第二条要好些,
    EXISTS表示如果存在就返回TRUE,然后执行,不一定需要扫描全表,极端情况下,如果所选择的记录中,第一条就是你所需要的话,那执行效率肯定比用NOT EXISTS好.
    而NOT EXISTS必须扫描全表,因为他必须判断不存在,必须要扫描全表来确定返回TRUE或者是FALSE.
      

  2.   

    估计出这个题目的人是按照自己的想法做的吧,估计他的答案也是第二句好。
    但是SQL Sever真正执行你语句的时候是这样做的吗?看看执行计划就知道了,其实实际的执行在内部是同样的,也就是说performance相同。SQL Sever在内部对要执行的语句会去寻找最优执行方式,两句的逻辑没有区别,执行的过程也没有区别,会被转换成同样的执行过程。
      

  3.   

    极端情况下,如果所选择的记录中,第一条就是你所需要的话,NOT EXISTS立马返回FALSE,不会全表扫描。所以两种写法效率都是一样的,任何情况。
      

  4.   

    Question 7: Can you tell me what the difference of two SQL statements at performance of execution? 
    Statement 1: 
    if NOT EXISTS ( select * from publishers where state = 'NY') 
    begin 
    SELECT 'Sales force needs to penetrate New York et' 
    end 
    else 
    begin 
    SELECT 'We have publishers in New York' 
    end 
    Statement 2: 
    if EXISTS ( select * from publishers where state = 'NY') 
    begin 
    SELECT 'We have publishers in New York' 
    end 
    else 
    begin 
    SELECT 'Sales force needs to penetrate New York et' 
    end 
    -----------------------------
    两句结果一样.从这个意义上来说没有区别.
    一般来说,用2比较好.个人认为是好理解点.不过建议有两点:
    1.所有的begin,end在此处意义不大,可不要.
    2.改为select 1 from publishers where state = 'NY'
      

  5.   

    EXISTS表示如果存在就返回TRUE,然后执行,不一定需要扫描全表,极端情况下,如果所选择的记录中,第一条就是你所需要的话,那执行效率肯定比用NOT EXISTS好. 
    而NOT EXISTS必须扫描全表,因为他必须判断不存在,必须要扫描全表来确定返回TRUE或者是FALSE. 大部分情况是一般情况不是极端的! 所以第二条的效率高速度快! 不可能是等效的! 第二条平均扫描时间是第一条的一半~! 楼主可能要去看看数据结构 看这个O 是多少!
      

  6.   


    PS:这是题目中已经加好的,我只是照抄了下,当然我知道只有一个语句可以不加begin end
      

  7.   


    肯定等效,sql server不会这么弱智到你说的那样处理。