将IF EXIST(SELECT 1 FROM)更改为IF EXIST(SELECT TOP 1 FROM)是否有任何副作用?

use*_*567 3 sql t-sql sql-server sql-server-2012

我的生产服务器上运行了现有的SP.我发现转换 IF EXIST(SELECT 1 FROM )IF EXIST(SELECT TOP 1 1 FROM )转换后会有一些显着的性能IF NOT EXIST(SELECT 1 FROM )提升IF NOT EXIST(SELECT TOP 1 1 FROM ).唯一的区别是TOP 1关键字.只是想知道改变这个是否有任何副作用?

Dam*_*ver 8

不,应该没有区别.EXISTS一找到一个匹配的行就立即退出.这就是为什么它总是优先于例如(select COUNT(*) from ...) > 0- a COUNT会强制考虑所有行.

如果您创建以下四个查询:

select * from sys.objects
select top 1 * from sys.objects
select 1 where exists(select * from sys.objects)
select 1 where exists(select top 1 * from sys.objects)
Run Code Online (Sandbox Code Playgroud)

并打开执行计划,您将看到第二个查询生成包含TOP运算符的执行计划.第3和第4个查询产生相同的计划.该TOP被忽略.