Поиск по индексу с опцией только поиска закладок для SQL-запроса?

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

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

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

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

Считаете ли вы, что поиск по закладкам настолько хорош, насколько это возможно, или какой еще вариант?

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


person Sam Schutte    schedule 24.02.2009    source источник


Ответы (2)


OH,

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

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

person Lieven Keersmaekers    schedule 24.02.2009

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

пример из BOL, это для 2005 года и выше

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

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

Ознакомьтесь с покрывающими индексами SQL Server для некоторых больше информации

person SQLMenace    schedule 24.02.2009
comment
Извините, я должен был указать, что это SQL 2000. - person Sam Schutte; 25.02.2009