NOT EXISTS和COUNT之间的区别(*)

时间:2016-02-04 22:25:54

标签: sql-server

我在两个我认为相同的陈述之间得到了不同的回应:println "date : " +params.endDate" vs SELECT COUNT(*)。在大约49次执行中,这两个陈述表现相同,但偶尔却没有。

我的猜测是,这些语句如何处理锁定的页面或者某些东西可能会更加“远远超出”。我的问题是这有什么区别?

我最初在我的SPROC中添加了一些日志记录(STATEMENT 3),这就是我看到它们具有不同值的方式。由于在执行此SPROC时NOT EXISTS的内容可能会发生变化,我是否添加了STATEMENT#3,以便在TableWithResults之前和之后确认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 100%始终相同。 几乎 @MatchingResultCount2 @IS_VALID = 'Y'@MatchingResultCount1 > 0 {1/1} {1/1} {/ 1}}。{/ 1>

我尝试在所有陈述中使用@IS_VALID = 'N',这似乎没有什么区别。

3 个答案:

答案 0 :(得分:4)

您应该更喜欢NOT EXISTS而不是COUNT(*),原因很简单:

当您说COUNT(*)时,数据库并不知道您并不真正关心完全行数。因此,只要找到至少匹配WHERE子句的一行,它就无法跳过剩余的结果。

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

答案 1 :(得分:0)

你可以在这里简化你的逻辑。

DECLARE @IS_VALID char(1) = 'N'

IF EXISTS ( SELECT * FROM TableWithResults WHERE  SearchId = @SearchId )
   SET @IS_VALID = 'Y';

我不明白你对锁定页面的看法。运行查询时返回的值始终相同。如果在此表中有其他事务锁定页面,则可以在执行期间的不同时刻获得不同的结果。

答案 2 :(得分:-1)

SQL

的一种情况下插入和更新
declare @countvariable int
set @countvariable = (select count(*) from tablename where columname = @parametername)

if(@countvariable =0)
begin
    insert condition
end
else
begin
    update condition
end