Подтвердить что ты не робот

Почему происходит сканирование моего кластерного индекса?

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? Что может вызвать сканирование индекса в кластерном индексе? Спасибо

4b9b3361

Ответ 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 и т.д.).

Марк