我的生产服务器上运行了现有的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个关键字。只是想知道改变这个是否有任何副作用?
答案 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仅限于按顺序排列。