Индексный поиск с параметром «Только поиск по закладкам» для SQL-запросов? - PullRequest
1 голос
/ 25 февраля 2009

Я работаю над оптимизацией запроса SQL, который идет против очень широкой таблицы в устаревшей системе. В данный момент я не могу сузить таблицу по разным причинам.

Мой запрос выполняется медленно, потому что он выполняет поиск по индексу по созданному мной индексу, а затем использует поиск закладок, чтобы найти дополнительные столбцы, которые ему не нужны, в индексе. Поиск закладок занимает 42% времени запроса (согласно оптимизатору запросов).

В таблице 38 столбцов, некоторые из которых являются nvarchars, поэтому я не могу создать покрывающий индекс, который включает все столбцы. Я попытался воспользоваться преимуществами пересечения индексов, создав индексы, которые охватывают все столбцы, однако эти «покрывающие» индексы не учитываются планом выполнения и не используются.

Кроме того, поскольку 28 из 38 столбцов извлекаются с помощью этого запроса, 28/38 столбцов таблицы будут храниться в этих покрывающих индексах, поэтому я не уверен, насколько это поможет.

Как вы думаете, поиск закладок так же хорош, как он собирается получить, или какой другой вариант будет?

(я должен указать, что это SQL Server 2000)

Ответы [ 2 ]

1 голос
/ 25 февраля 2009

ОН,

Должен работать индекс покрытия с include. Другим вариантом может быть создание кластеризованного индексированного представления , содержащего только нужные вам столбцы.

С уважением,
Ливны

1 голос
/ 25 февраля 2009

Вы можете создать индекс с включенными столбцами в качестве другой опции

пример с BOL, это на 2005 год и выше

CREATE NONCLUSTERED INDEX IX_Address_PostalCode
    ON Person.Address (PostalCode)
    INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);

Чтобы ответить на этот вопрос: «Я пытался использовать пересечение индексов, создавая индексы, которые охватывают все столбцы, однако эти« покрывающие »индексы не учитываются планом выполнения и не используются». Индекс можно использовать только в том случае, если запрос создается таким образом, что его можно саргитировать, другими словами, если вы используете функцию в левой части оператора или пропускаете первый столбец индекса в предложении WHERE, тогда индекс выиграл не будет использоваться. Если селективность индекса низкая, то индекс также не будет использоваться

Проверьте Индексы SQL Server для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...