Я сталкиваюсь с проблемой, которая сводит меня с ума.При выполнении запроса ниже, я получаю счет 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).
ОБНОВЛЕНИЕ - Включая профиль статистики
Столбец 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 1
0 0
1 1
1 1
Строки и Выполнения для 2-го запроса (с различными)
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) во 2-й запрос (с различными)
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