哪个更好选择1 vs select *来检查记录的存在?

时间:2014-11-07 09:42:26

标签: sql-server

在以下情况下哪个更好。

1

IF EXISTS(SELECT * FROM Table WHERE ID = 3)
BEGIN
    -------
END

Vs的

2

IF EXISTS(SELECT 1 FROM Table WHERE ID = 3)
BEGIN
    -------
END

或者两者都相同?

1 个答案:

答案 0 :(得分:8)

EXISTS将检查集合中是否存在任何记录。因此,如果您从100万条记录中进行SELECT,或者您从1条记录中进行SELECT(假设使用TOP 1),它们将具有相同的结果和相同的性能甚至相同的执行计划。(为什么?)因为存在不会等待直到100万条记录扫描完成(或完成1条记录扫描)。每当它在集合中找到记录时,它将返回结果为TRUE(在这种情况下,无论是使用*还是列名都将具有相同的性能结果)。

USE pubs
GO

IF EXISTS(SELECT * FROM dbo.titleauthor)
PRINT 'a'

IF EXISTS(SELECT TOP 1 * FROM dbo.titleauthor)
PRINT 'b'

下面是这些查询的执行计划(因为我有屏幕尺寸问题,我已经裁剪了它的图像) enter image description here enter image description here

但是当你使用如下查询时,这个场景和性能甚至执行计划将完全改变(我不知道为什么要使用这个查询!):

USE pubs
GO

IF EXISTS(SELECT * FROM dbo.titleauthor)
PRINT 'a'

IF EXISTS(SELECT 1 )
PRINT 'b'

在这种情况下,由于SQL Server不需要在第二个查询中执行任何扫描操作,因此执行计划将更改如下: enter image description here enter image description here