почему индекс nobjectid никогда не указывается
используется? Я ожидал бы там быть
индекс поиска или сканирования, когда nobjectid
указано в предложении where
Распространенное заблуждение!
Одно замечание: поскольку вы используете SELECT *
, вам нужны все данные из таблицы. Таким образом, в конце концов, SQL Server должен вернуться к фактическим страницам данных и извлечь все значения.
Когда поиск по индексу происходит и обнаруживает попадание, в этом случае SQL Server должен выполнить поиск по закладке - довольно дорогая операция.
И поскольку эти операции довольно дороги, SQL Server будет стараться их избегать, если сможет - поэтому во многих случаях вместо этого будет использоваться сканирование таблицы, поскольку в конечном итоге это быстрее, чем поиск индекса nc, а затем выполнение поиск по закладкам.
Очков для проверки:
насколько избирательно является столбцом nobjectid
? Этот здесь звучит как более или менее уникальный идентификатор - это было бы хорошо. Если у вас есть индекс для столбца, который будет не очень избирательным, то часто оптимизатор запросов будет его игнорировать (поскольку ему придется уже проверять слишком много строк, поэтому в конце сканирование таблицы будет быстрее)
сколько строк есть в таблице ?? Для небольших таблиц (менее нескольких тысяч строк) часто гораздо быстрее выполнить сканирование таблицы с самого начала
Кроме того, из вашего первого плана выполнения с «поиском кучи RID» я бы пришел к выводу, что у вас нет кластеризованного индекса в таблице - добавьте один сразу !! Отсутствие кластеризованного ключа (таким образом, имея heap вместо кластеризованной таблицы) также замедляет множество операций и снижает эффективность некластеризованного индекса.
Попробуйте добавить кластерный индекс в столбец «NUSE»:
- узкая
- уникальный
- стабильный
- постоянно увеличивается
INT IDENTITY
является идеальным кандидатом - UNIQUEIDENTIFIER
или очень широкий составной набор столбцов являются худшими. Читайте все о выборе правильного кластерного индекса в блоге Кимберли Триппа