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 毫秒。
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 毫秒。
第二条要好些,
EXISTS表示如果存在就返回TRUE,然后执行,不一定需要扫描全表,极端情况下,如果所选择的记录中,第一条就是你所需要的话,那执行效率肯定比用NOT EXISTS好.
而NOT EXISTS必须扫描全表,因为他必须判断不存在,必须要扫描全表来确定返回TRUE或者是FALSE.
但是SQL Sever真正执行你语句的时候是这样做的吗?看看执行计划就知道了,其实实际的执行在内部是同样的,也就是说performance相同。SQL Sever在内部对要执行的语句会去寻找最优执行方式,两句的逻辑没有区别,执行的过程也没有区别,会被转换成同样的执行过程。
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'
而NOT EXISTS必须扫描全表,因为他必须判断不存在,必须要扫描全表来确定返回TRUE或者是FALSE. 大部分情况是一般情况不是极端的! 所以第二条的效率高速度快! 不可能是等效的! 第二条平均扫描时间是第一条的一半~! 楼主可能要去看看数据结构 看这个O 是多少!
PS:这是题目中已经加好的,我只是照抄了下,当然我知道只有一个语句可以不加begin end
肯定等效,sql server不会这么弱智到你说的那样处理。