gpt4 book ai didi

sql-server - NOT EXISTS 和 COUNT(*) 的区别

转载 作者:行者123 更新时间:2023-12-03 17:04:33 26 4
gpt4 key购买 nike

我在两个我认为等效的语句之间得到了不同的响应:SELECT COUNT(*)对比 NOT EXISTS .在大约 49 次的 50 次执行中,这两个语句的行为相同,但有时它们不同。

我的猜测是这些语句处理锁定页面的方式或可能更“遥远”的东西之间存在差异。我的问题是有什么区别?

我最初在我的 SPROC 中添加了一些日志记录(STATEMENT 3),这就是我看到它们具有不同值的方式。内容自TableWithResults可以在此 SPROC 执行时更改,我是否添加了 STATEMENT #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@MatchingResultCount2 100% 始终相同。几乎一直 @IS_VALID = 'Y'@MatchingResultCount1 > 0 ,但 1/50 倍, @IS_VALID = 'N'@MatchingResultCount1 > 0 .

我尝试使用 WITH (NOLOCK)在所有声明中,这似乎没有什么区别。

最佳答案

您通常应该更喜欢 NOT EXISTSCOUNT(*)原因很简单:

当你说 COUNT(*) ,数据库不知道您并不真正关心确切的行数。因此,只要至少有一行与 WHERE 匹配,它就不能跳过剩余的结果。条款已经找到。

现在,作为副作用,这也可能导致 COUNT(*)查询比 NOT EXISTS 获取更多的锁万一查询NOT EXISTS设法跳过行。这将取决于数据库(我不确定 SQL Server)

关于sql-server - NOT EXISTS 和 COUNT(*) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35212880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com