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

时间:2014-01-30 08:24:36

标签: sql sql-server tsql 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个关键字。只是想知道改变这个是否有任何副作用?

2 个答案:

答案 0 :(得分:8)

不,应该没有区别。只要找到一个匹配的行,EXISTS就会退出。这就是为什么它总是优先于例如(select COUNT(*) from ...) > 0 - 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)

启用执行计划,您将看到第二个查询生成包含TOP运算符的执行计划。第3和第4个查询生成相同的计划。 TOP被忽略。

答案 1 :(得分:-1)

当您添加TOP 1时,它不会继续到其他行。这就是产生差异的原因。否则它将从头到尾读取整个表格。

要检查记录是否存在,您不需要它,因为您显然要添加where子句。这可能有微小的差别。您可以使用索引获得真正的性能差异。

使用TOP仅限于按顺序排列。