#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:
Я просто попытался смоделировать ту же проблему, однако сканирования таблицы нет, вместо этого использовался кластеризованный индекс ячейки, в то же время вы можете попытаться принудительно ввести индекс, вы можете проверить синтаксис здесь и проблемы, с которыми вы можете столкнуться при принудительном индексировании здесь. Надеюсь, это поможет.