Индексируйте с помощью Leftouter join в sql server 2005 всегда выполняется сканирование индекса

#sql-server #tsql #indexing #left-join

#sql-сервер #tsql #индексирование #соединение по левому краю

Вопрос:

У меня есть запрос, соединяющий несколько таблиц, последняя таблица соединяется с помощью LEFT JOIN. Последняя таблица содержит более миллиона строк, и план выполнения показывает сканирование таблицы в ней. У меня есть проиндексированные столбцы, по которым выполняется объединение. Всегда используется сканирование индекса, но если я заменяю ЛЕВОЕ СОЕДИНЕНИЕ ВНУТРЕННИМ СОЕДИНЕНИЕМ, используется поиск по индексу, и выполнение занимает несколько секунд, но при ЛЕВОМ СОЕДИНЕНИИ выполняется сканирование таблицы, поэтому выполнение занимает несколько минут. Отключает ли использование внешних соединений индексы? Пропустил я что-то? В чем причина такого поведения? Вот запрос

Выберите * ИЗ



      Subjects                  s
    INNER join       Question  q ON q.SubjectID   = s.SubjectID
    INNER JOIN       Answer    c ON a.QestionID   = q.QuestionID
    Left outer JOIN  Cell      c ON c.Question ID = q.QuestionID
 

Где S.SubjectID =15

В таблице "Subject" есть кластерный индекс по SubjectID. и в других таблицах есть некластерный индекс для QuestionID.

Решение: я пробую это другим способом, и теперь я ищу индекс в таблице ячеек. Вот измененный запрос:

Выберите * ИЗ



      Subjects                  s
    INNER join       Question  q ON q.SubjectID   = s.SubjectID
    INNER JOIN       Answer    c ON a.QestionID   = q.QuestionID
    Left outer JOIN  Cell      c ON c.Question ID = q.QuestionID
                                              AND C.QuestionID > 0
                                              AND C.CellKey > 0
 

Где S.SubjectID =15

Таким образом, я добился высокой селективности в таблице ячеек. 🙂

Комментарии:

1. Не могли бы вы показать нам запрос, а также определения таблиц и индексов? Какую версию sql server вы используете?

2. Привет, автоматический, я отредактировал вопрос, пожалуйста, посмотрите. Спасибо

3. @user999896 — пожалуйста, покажите ваши определения таблиц.

4. Субъекты: Кластерный индекс по SubjectID….. Для индекса кластера вопросов по QuestionKey и некластерного индекса по QuestionID …. Для таблицы «Answer» кластерный индекс по AnswerKey и некластерный индекс по QuestionID …. Для таблицы «Cell» Кластерный индекс по CellKey и некластерный индекс по QuestionID

5. Привет, JNK, я получаю поиск по индексу для Subjects и всех других таблиц, кроме таблицы ячеек, потому что, как вы можете видеть в предложении where, я использую SubjectID, который дал мне отфильтрованные значения с использованием index см., У меня проблема только с таблицей ячеек. Поскольку в таблице ячеек выполняется сканирование индекса

Ответ №1:

Я просто попытался смоделировать ту же проблему, однако сканирования таблицы нет, вместо этого использовался кластеризованный индекс ячейки, в то же время вы можете попытаться принудительно ввести индекс, вы можете проверить синтаксис здесь и проблемы, с которыми вы можете столкнуться при принудительном индексировании здесь. Надеюсь, это поможет.