Індекс з приєднанням Leftouter завжди має індексний сканування в sql server 2005

У мене є запит, що приєднується до кількох таблиць, остання таблиця об'єднана з лівим Об'єднати Останній стіл має більше мільйона рядків і план виконання показує сканування таблиці на ньому. У мене є індексовані стовпці на якій зроблено приєднання. Завжди використовуйте сканування індексу, але якщо я заміню LEFT JOIN з INNER JOIN, використовується індексний пошук використовується і виконується займає кілька секунд, але з LEFT JOIN - це сканування таблиці, тож виконання займає кілька хвилин. Чи використовує зовнішні з'єднання індекси? Пропустив я щось? Яка причина такої поведінки? Ось запит

Select * 
FROM

     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

Where S.SubjectID =15
There is cluster index on SubjectID in "Subject" table. and there is non-cluster index on questionID in other tables.

Рішення: Я спробую це іншим способом, і зараз я шукаю індекс у стільнику Cell. Ось змінений запит:

Select * 
FROM

     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

Where S.SubjectID =15

Таким чином, я зробив високу вибірковість на стільнику Cell. :)

0
@ user999896 - показати також ваші визначення таблиці, будь ласка.
додано Автор JNK, джерело
... і план виконання?
додано Автор JNK, джерело
Я також попросив визначити таблиці. Чи є Question ID int? Чи є це в усіх таблицях однаково?
додано Автор JNK, джерело
Покажіть нам запит, а також таблиці та індекси? Яку версію SQL Server ви використовуєте?
додано Автор automatic, джерело
Привіт автоматично, я відредагував питання, будь ласка, подивіться. Дякую
додано Автор user999896, джерело
Предмети: Кластерний індекс на SubjectID ..... Для запитання Кластерний індекс на QuestionKey та NonCluster індексу на QuestionID .... Для таблиці "Answer", індекс кластера на AnswerKey та індекс не-кластеру на QuestionID .... Для "Cell "табличний кластерний індекс на CellKey та не-кластерний індекс на QuestionID
додано Автор user999896, джерело
Привіт JNK, я отримую індексний пошук на предметів і весь інший стіл, за винятком стільникового столу, тому що ви можете побачити в пункті, де я використовую SubjectID, який дав мені відфільтровані значення, використовуючи index, у мене є тільки проблема з стільницею Cell. Оскільки на стільнику стільника є сканування INdex
додано Автор user999896, джерело
Так всі типи стовпців індексу int, і це однакове у всій таблиці.
додано Автор user999896, джерело

1 Відповіді

Я просто намагався імітувати ту ж саму проблему, однак, замість того, щоб вона використовувала кластеризований індекс Cell, в той же час ви не змогли спробувати примусити цей індекс, ви можете перевірити синтаксис тут та проблеми, які ви можете обличчя при примушенні індексу тут Сподіваюся, це допоможе.

0
додано