我知道 SQLEXISTS
检查是否存在行,但是它会评估整个表达式吗?例如,会是这样的:
IF EXISTS (SELECT TOP 1 1 FROM table WITH (NOLOCK))
BEGIN
...
END
比这样的更快:
IF EXISTS (SELECT 1 FROM table WITH (NOLOCK))
BEGIN
...
END
我知道 SQLEXISTS
检查是否存在行,但是它会评估整个表达式吗?例如,会是这样的:
IF EXISTS (SELECT TOP 1 1 FROM table WITH (NOLOCK))
BEGIN
...
END
比这样的更快:
IF EXISTS (SELECT 1 FROM table WITH (NOLOCK))
BEGIN
...
END
Exists 将在第一次命中后停止,因为表达式的计算结果为真,因此顶部(1)部分是不必要的。
两者都应该运行完全相同。SQL Server 考虑到这EXISTS
是一个短路操作并且不评估返回结果,只是检查是否有返回结果!
不,不会的。
SQL Server
用于TOP
计划评估EXISTS
。
这些语句生成相同的查询计划,因此没有区别。在我看来,第二个例子更容易阅读。