在以下情况下哪个更好。
1
IF EXISTS(SELECT * FROM Table WHERE ID = 3)
BEGIN
-------
END
Vs的
2
IF EXISTS(SELECT 1 FROM Table WHERE ID = 3)
BEGIN
-------
END
或者两者都相同?
答案 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'
下面是这些查询的执行计划(因为我有屏幕尺寸问题,我已经裁剪了它的图像)
但是当你使用如下查询时,这个场景和性能甚至执行计划将完全改变(我不知道为什么要使用这个查询!):
USE pubs
GO
IF EXISTS(SELECT * FROM dbo.titleauthor)
PRINT 'a'
IF EXISTS(SELECT 1 )
PRINT 'b'
在这种情况下,由于SQL Server不需要在第二个查询中执行任何扫描操作,因此执行计划将更改如下: