У меня в SQL Server 2005 есть большая таблица, из которой мне приходится выбирать записи по некластерному ключу, и я пытаюсь оптимизировать этот процесс как можно лучше.
В таблице довольно много столбцов, и я добавил некластеризованные индексы для трех разных столбцов.
SELECT * FROM table WHERE Field1 = 10;
SELECT * FROM table WHERE Field2 = 40;
SELECT * FROM table WHERE Field3 = 'A';
Field1 и Field2 - это целочисленные поля, а Field3 - это varchar.
Когда я запрашиваю примерный план выполнения запроса у SQL Server для этих трех запросов, я получаю в основном один и тот же план для каждого:
SELECT -> Nested Loop -> Index Seek
-> Key Lookup
Но я считаю, что это время исполнения крайне несовместимо. В частности, второй запрос занимает 98% от общей стоимости запроса. Его план выполнения такой же, как и у других, за исключением того, что шаг поиска ключа стоит 100% по сравнению с поиском по индексу. В двух других запросах он ближе к 50%.
Я понимаю, что поиск ключей нежелателен, и его можно избежать, добавив столбцы в индексы, чтобы не нужно было искать дополнительные столбцы. В этом случае, однако, я хочу, чтобы все столбцы в таблице были возвращены мне, поэтому нет смысла добавлять их все в индекс. Но как один индекс может заставить операцию поиска ключей занимать намного больше времени, чем другой поиск ключа?