Возможно ли - или рекомендуется - индексировать встроенный запрос для повышения производительности? - PullRequest
1 голос
/ 18 ноября 2011

Я не эксперт по TSQL, но мне интересно, возможно ли такое:

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

SELECT * 
FROM tProduct
JOIN (SELECT ProductId FROM ...... -- some other joins) tInlineQuey
ON tInlineQuery.ProductId = tProduct.Id 
WHERE tInlineQuery. -- some econdition

Возможно или имеет смысл создать indedx для tInlineQuery, чтобы применить фильтрацию к этому набору результатов быстрее?
Если это так, как это возможно?

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

У Эндрю отличный ответ, но если вы часто будете использовать этот подзапрос, другим вариантом будет создание индексированного представления. Есть несколько хороших статей об этом, в том числе одна, написанная мной на SqL Server Central под названием Об индексах и представлениях .

3 голосов
/ 18 ноября 2011

Нет, у вас могут быть подходящие индексы для объектов в подзапросе, но вы не можете добавить временный индекс в подзапрос, поскольку он у вас там есть.Вы можете запросить подсказку о способе объединения данных, например, о вложенном цикле, объединении или хэш-соединении, но оптимизатор стремится принять правильное решение.

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

Для этого вам потребуется хранимая процедура и включить следующий код:

SELECT yourFields
INTO #TempTableName
JOIN SomeOtherTables
WHERE SomeField=SomeValue;

CREATE CLUSTERED INDEX SomeIndexName ON #TempTableName(SomeField,AnotherField);

SELECT *
FROM tProduct p
JOIN #TempTableName t ON t.SomeField = p.SomeField
...

DROP TABLE #TempTableName -- optional, the table will die when it goes out of scope at the end of the procedure.

Индекс временной таблицы не должен быть кластеризован, это зависит от вашего выбора.

...