SQL заменить cte на фактическую таблицу для повышения производительности? - PullRequest
1 голос
/ 02 июля 2019

Таблица #temp имеет индекс на (NrBL, LgnBL).Но в SQL Server 2016 общие табличные выражения не могут быть проиндексированы.Может ли быть быстрее использовать другую временную таблицу вместо CTE и индексировать ее на (NrBL, LgnBL)?

WITH cte (NrBL, LgnBL, clientNr) AS 
(
    SELECT NrBL, LgnBL, clientNr
    FROM #temp
    WHERE Niveau=0
)
UPDATE a
SET a.ClientNr = cte.ClientNr
FROM #temp AS a
JOIN cte ON a.NrBL=cte.NrBL AND a.LgnBL = cte.LgnBL;

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Я думаю, что обновляемый CTE с оконными функциями - лучший подход:

WITH cte (NrBL, LgnBL, clientNr) AS (
      SELECT t.*,
             MAX(CASE WHEN Niveau = 0 THEN clientNr END) OVER (PARTITION BY NrBL, LgnBL) as new_clientNr
      FROM #temp t
     )
UPDATE cte
    SET ClientNr = new_ClientNr
    WHERE new_clientNR IS NOT NULL;

Вы можете создать индекс для (NrBL, LgnBL, Niveau, clientNr).

1 голос
/ 02 июля 2019

Это может помочь в использовании временной таблицы (иногда оптимизатор запросов может вас удивить), но я считаю, что более вероятно, что временная таблица ухудшит ситуацию .

Это правильно, вы не можете индексировать CTE ... но , что не означает, что индексы не будут использоваться для запроса . В исходных таблицах из CTE все еще есть индексы, и эти индексы могут быть полезны для вашего полного запроса. Для временной таблицы вам определенно необходимо заполнить как полную таблицу, так и индекс (ы).

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