У меня проблема, которая сводит меня с ума. При выполнении запроса ниже я получаю счет 233,769
SELECT COUNT(distinct Member_List_Link.UserID)
FROM Member_List_Link with (nolock)
INNER JOIN MasterMembers with (nolock)
ON Member_List_Link.UserID = MasterMembers.UserID
WHERE MasterMembers.Active = 1 And
Member_List_Link.GroupID = 5 AND
MasterMembers.ValidUsers = 1 AND
Member_List_Link.Status = 1
Но если я запускаю тот же запрос без отдельного ключевого слова, я получаю счет 233,748
SELECT COUNT(Member_List_Link.UserID)
FROM Member_List_Link with (nolock)
INNER JOIN MasterMembers with (nolock)
ON Member_List_Link.UserID = MasterMembers.UserID
WHERE MasterMembers.Active = 1 And Member_List_Link.GroupID = 5
AND MasterMembers.ValidUsers = 1 AND Member_List_Link.Status = 1
Чтобы протестировать, я воссоздал все таблицы и поместил их в временные таблицы и снова запустил запросы:
SELECT COUNT(distinct #Temp_Member_List_Link.UserID)
FROM #Temp_Member_List_Link with (nolock)
INNER JOIN #Temp_MasterMembers with (nolock)
ON #Temp_Member_List_Link.UserID = #Temp_MasterMembers.UserID
WHERE #Temp_MasterMembers.Active = 1 And
#Temp_Member_List_Link.GroupID = 5 AND
#Temp_MasterMembers.ValidUsers = 1 AND
#Temp_Member_List_Link.Status = 1
И без отдельного ключевого слова
SELECT COUNT(#Temp_Member_List_Link.UserID)
FROM #Temp_Member_List_Link with (nolock)
INNER JOIN #Temp_MasterMembers with (nolock)
ON #Temp_Member_List_Link.UserID = #Temp_MasterMembers.UserID
WHERE #Temp_MasterMembers.Active = 1 And
#Temp_Member_List_Link.GroupID = 5 AND
#Temp_MasterMembers.ValidUsers = 1 AND
#Temp_Member_List_Link.Status = 1
На боковой ноте я воссоздал временные таблицы, просто выполнив (select * from Member_List_Link into #temp...
)
И теперь, когда я проверяю разницу между COUNT (столбец) и COUNT (отдельный столбец) с этими временными таблицами, я не вижу никаких!
Итак, почему существует расхождение с исходными таблицами?
Я запускаю SQL Server 2008 (Dev Edition).
UPDATE - включение профиля статистики
Столбец PhysicalOp только для первого запроса (без четкого)
NULL
Compute Scalar
Stream Aggregate
Clustered Index Seek
Столбец PhysicalOp только для первого запроса (с отличным)
NULL
Compute Scalar
Stream Aggregate
Parallelism
Stream Aggregate
Hash Match
Hash Match
Bitmap
Parallelism
Index Seek
Parallelism
Clustered Index Scan
Строки и выполнение для первого запроса (без четких)
1 1
0 0
1 1
1 1
Строки и выполнение для второго запроса (с четким)
Rows Executes
1 1
0 0
1 1
16 1
16 16
233767 16
233767 16
281901 16
281901 16
281901 16
234787 16
234787 16
Добавление OPTION (MAXDOP 1) во второй запрос (с четким)
Rows Executes
1 1
0 0
1 1
233767 1
233767 1
281901 1
548396 1
И результат PhysicalOp
NULL
Compute Scalar
Stream Aggregate
Hash Match
Hash Match
Index Seek
Clustered Index Scan