Почему происходит сканирование моего кластерного индекса?
SQL 2000
Таблица NED имеет внешний ключ для таблицы SIGN NED.RowID для SIGN.RowID
Таблица SIGN имеет внешний ключ для таблицы NED SIGN.SignID для NED.SignID
RowID и SignID являются кластеризованными первичными ключами, которые являются GUID (не мой выбор)
Предложение WHERE:
FROM
[SIGN] A
INNER JOIN NED N ON A.SIGNID = N.SIGNID
INNER JOIN Wizard S ON A.WizardID = S.WizardID
INNER JOIN [Level] SL ON N.LevelID = SL.LevelID
LEFT JOIN Driver DSL ON SL.LevelID = DSL.LevelID
AND DSL.fsDeptID = @fsDeptID
INNER JOIN [Character] ET ON S.CharacterID = ET.CharacterID
INNER JOIN Town DS ON A.TownID = DS.TownID
WHERE
(A.DeptID = @DeptID OR
S.DeptID = @DeptID
AND
A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime
AND
A.NEDStatusID = 2
Почему в этом вопросе есть таблица INDEX SCAN в таблице SIGN? Что может вызвать сканирование индекса в кластерном индексе? Спасибо
Ответы
Ответ 1
Здесь хорошее сообщение в блоге о том, когда SQL Server достигает "точки опроса" и переключается с индекса на поиск индекса/таблицы:
http://www.sqlskills.com/BLOGS/KIMBERLY/post/The-Tipping-Point-Query-Answers.aspx
Вы можете посмотреть, как ваши запросы фильтруются, так как переломная точка часто намного меньше строк, чем ожидают люди.
Ответ 2
Сканирование с кластерным индексом - это то, как SQL Server определяет полное сканирование таблицы в таблице с кластерным индексом. Это связано с тем, что вам не хватает индексов в таблице SIGN для удовлетворения предложения WHERE или потому, что он решил, что таблица SIGN достаточно мала (или недостаточно индексирует), что сканирование таблицы будет более эффективным.
Просто просмотрев запрос, вам, вероятно, придется индексировать столбец DeptID, а также некоторую комбинацию StartTime, EndTime и NEDStatusID, чтобы избежать сканирования таблицы. Если причина, о которой вы просите, связана с тем, что у вас проблемы с производительностью, вы также можете запустить мастер настройки индексов (теперь советник по настройке ядра базы данных в клиентских инструментах SQL2005 +) и дать ему несколько советов, по каким индексам создавать скорость по вашему запросу.
Ответ 3
Поскольку предложение WHERE не относится к индексированным столбцам.
Ответ 4
У вас есть несколько ограничений на таблицу SIGN A, если я прочитал это правильно:
WHERE
(A.DeptID = @DeptID OR
S.DeptID = @DeptID
AND
A.[EndTime] > @StartDateTime AND A.[StartTime] < @EndDateTime
AND
A.NEDStatusID = 2
Индексированы ли какие-либо из этих ограничений (например, DeptID, StartTime, EndTime, NEDStatusID)? Насколько хорошо эти поля выбираются из вашего набора данных?
Если у вас 10 миллионов. строк и NEDStatusID имеет только 10 возможных значений, то любое ограничение в этом поле всегда будет давать прибл. 1 мл. строки - в этом случае для SQL Server может быть проще (и менее дорогостоящим) выполнить полное сканирование таблицы (кластерное сканирование индексов), особенно если ему также необходимо проверить дополнительные предложения WHERE в той же таблице, которые не индексируются, либо (StartTime, EndTIme и т.д.).
Марк