Может ли запрос использовать более одного некластеризованного индекса для таблицы? - PullRequest
2 голосов
/ 26 апреля 2011

У меня есть запрос, который выглядит так

SELECT TOP 1000 C.iId_company
FROM dbo.Company AS C WITH(NOLOCK)
WHERE 
C.col_1 LIKE 'something%'
OR C.col_1 LIKE 'something2%'
OR C.col_1 LIKE 'something3%'
OR C.col_2 LIKE 'something%'
OR C.col_2 LIKE 'something2%'
OR C.col_2 LIKE 'something3%'

Я попытался сделать этот запрос быстрее и попытался добавить индексы для col_1 и col_2. Если я закомментирую условия, касающиеся col_2, запрос будет очень быстрым, то же самое относится и к col_1 (если я закомментирую условия относительно col_1). Но когда я оставляю это так, это та же самая старая история, очень медленная.

Что я подозреваю при рассмотрении плана выполнения, так это то, что одновременно используется только один индекс, а SQL выполняет сканирование подмножества после использования первого индекса. Я пробовал разные вещи (делает индекс обоих столбцов, но тоже не работает)

На самом деле мое единственное решение - разделить запрос и использовать UNION. Есть ли способ сделать такой запрос быстрее и сохранить его в одном запросе?

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Используйте союз. То есть:

SELECT TOP 1000 C.iId_company
FROM dbo.Company AS C WITH(NOLOCK)
WHERE 
C.col_1 LIKE 'something%'
OR C.col_1 LIKE 'something2%'
OR C.col_1 LIKE 'something3%'

union all 

SELECT TOP 1000 C.iId_company
FROM dbo.Company AS C WITH(NOLOCK)
WHERE 
C.col_2 LIKE 'something%'
OR C.col_2 LIKE 'something2%'
OR C.col_2 LIKE 'something3%'

Отрегулируйте по мере необходимости (например, вам может понадобиться обернуть всю эту вещь в выборку, чтобы вы могли добавить заказ по предложению, чтобы получить то, что вы считаете топ-1000). Но я думаю, что вы будете довольны этим решением.

0 голосов
/ 26 апреля 2011

Ваши требования указывают на необходимость двух отдельных индексов, по одному на каждый столбец, который вы ищете.Используйте любой инструмент DBA, который вы предпочитаете генерировать, и просмотрите план объяснения для запроса.Теперь вы можете начать заново обрабатывать запрос, чтобы увидеть, выглядит ли план объяснения лучше, чем ваши предыдущие попытки.Возможно, вам придется использовать UNION или общее табличное выражение, чтобы объединить два запроса в один набор результатов.

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