【发布时间】:2015-12-07 11:58:20
【问题描述】:
我知道有很多这样的问题,但我找不到与我的问题相关的问题。
看这个问题,Is Changing IF EXIST(SELECT 1 FROM ) to IF EXIST(SELECT TOP 1 FROM ) has any side effects?
具体参考答案中的这一段:
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)
我正在运行一些自己的测试以正确理解它。如答案所示:
select 1 where exists(select top 1 * from sys.objects)
select 1 where exists(select top 1 1 from sys.objects)
两者都导致相同的执行计划,也导致相同的计划
select 1 where exists(select * from sys.objects)
select 1 where exists(select 1 from sys.objects)
根据我对此类问题的研究,“SELECT TOP 1 1” VS “IF EXISTS(SELECT 1”。我推断这是公认的最佳做法:
select 1 where exists(select * from sys.objects)
我的第一个问题是为什么这比这个更受欢迎:
select 1 where exists(select 1 from sys.objects)
为了理解它,我将它们分解为更基本的表达方式(我使用“top 1”来模拟类似于存在的执行计划):
select top 1 * from sys.objects
select top 1 1 from sys.objects
我现在看到第一个是执行时间的 80%(相对于 2 个批次),而第二个只有 20%。那么使用它不是更好的做法吗
select 1 where exists(select 1 from sys.objects)
因为它可以应用于这两种情况,从而减少可能的人为错误?
【问题讨论】:
-
注意:这里有一篇很好的文章:sqlservercentral.com/articles/T-SQL/154149
-
是的,我也刚刚读过那篇文章,这是一个确定的测试。在使用 null 而不是 * 或 1 时,我很想找时间来测试他的结果,因为 null 使用的是 CPU 与内存上的指针。
标签: sql-server tsql database-performance