我在两个我认为等效的语句之间得到了不同的响应:SELECT COUNT(*)
vs NOT EXISTS
。在大约 50 次执行中的 49 次中,这两个语句的行为相同,但有时却不然。
我的猜测是,这些语句处理锁定页面或处理更“遥远”的事情的方式之间存在差异。我的问题是有什么区别?
我最初在我的 SPROC 中添加了一些日志记录(语句 3),这就是我看到它们具有不同值的方式。由于内容TableWithResults
可以在该 SPROC 执行时更改,我是否添加了语句#3,以便我可以确认结果COUNT(*)
之前和之后NOT EXISTS
:
-- STATEMENT 1: If this is returning 1...
SET @MatchingResultCount1 = ( SELECT COUNT (*) FROM TableWithResults WHERE SearchId = @SearchId )
-- STATEMENT 2: ...I expect this to evaluate "False" and sets IS_VALID='Y'
IF NOT EXISTS ( SELECT * FROM TableWithResults WHERE SearchId = @SearchId )
SET @IS_VALID = 'N';
ELSE
SET @IS_VALID = 'Y';
-- STATEMENT 3: This is to confirm the table didn't change
SET @MatchingResultCount1 = ( SELECT COUNT (*) FROM TableWithResults WHERE SearchId = @SearchId )
我看到的是@MatchingResultCount1
and @MatchingResultCount2
100% 始终相同。Almost每时每刻@IS_VALID = 'Y'
when @MatchingResultCount1 > 0
,但是 1/50 倍,@IS_VALID = 'N'
when @MatchingResultCount1 > 0
.
我尝试使用WITH (NOLOCK)
在所有的陈述上,这似乎没有什么区别。
你通常应该更喜欢NOT EXISTS
over COUNT(*)
原因很简单:
当你说COUNT(*)
,数据库不知道你并不真正关心exact行数。因此,它不能立即跳过剩余的结果at least一行匹配WHERE
已找到条款。
现在,作为副作用,这也可能导致COUNT(*)
查询获取的锁多于NOT EXISTS
查询情况NOT EXISTS
设法跳过行。这将取决于数据库(我不确定 SQL Server)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)