Контекст: SQL Server 2008. Есть 2 таблицы для внутреннего объединения. Таблица фактов, содержащая 40 миллионов строк, содержит ключ пациента, введенные лекарства и другие факты. Существует уникальный индекс (некластеризованный) для ключа лекарства и ключа пациента, объединенных в указанном порядке. Таблица размеров - это список лекарств (70 строк). Присоединение предназначено для получения кода лекарства (бизнес-кода) на основе ключа лекарства (суррогатного ключа). Запрос:
SELECT a.PKey, a.SomeFact, b.MCode
FROM tblFact a
JOIN tblDIM b ON a.MKey = b.MKey
Все возвращаемые столбцы являются целыми числами. Вышеупомянутый запрос выполняется за 7 минут, и его план выполнения показывает, что используется индекс (MKey, PKey). Индекс был перестроен прямо перед запуском. Когда я отключил индекс в таблице фактов (или скопировал данные в новую таблицу с той же структурой, но без индекса), тот же запрос занимает всего 1:40 минуты.
Статистика ввода-вывода также ошеломляет.
С индексом: Таблица tblFACT. Количество сканирований 70, логических чтений 190296338, физических чтений 685138, упреждающих чтений 98713
Без индекса: таблица tblFACT_copy. Счетчик сканирований 17, логических чтений 468891, физических чтений 0, упреждающих чтений 419768
Вопрос: почему он пытается использовать индекс и идти по неэффективному пути?