Я столкнулся с проблемой, которая сводит меня с ума. Когда выполняя запрос ниже, я получаю счетчик 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 в #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
Добавление ОПЦИИ (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