Ваш вопрос не завершен, запрос медленный, но какая часть запроса медленная?
CTEQuery
или LEFT JOIN in really big query
Я думаю, что требуется скрипт большого запроса вместе сподробно, например, какая таблица содержит сколько строк, их тип данных и т. д.
Подробно расскажите о большом запросе.
также дайте нам знать, если какой-либо UDF включен в условие соединения.
Почему вы left join
Temp таблица?ПОЧЕМУ НЕ INNER JOIN
Проверьте производительность отдельно или CTE и Big Query.
После использования [D].[ParentDesignKey] is not null
в рекурсивной части,
SELECT
[D].*,
[Lvl] + 1 AS [Lvl]
FROM
[dbo].[Design] AS [D]
INNER JOIN
[RCTE] AS [rc] ON [rc].[DesignKey] = [D].[ParentDesignKey]
and [D].[ParentDesignKey] is not null
ПРИМЕЧАНИЕ: В CTE используйте только те столбцы, которые требуются.
Если возможно Pre- Calculate [Lvl]
, потому что Recursive CTE
производительность особенно плохая, с большим количеством записей.
Сколько строкбудет обрабатываться в среднем в каждом запросе CTE?
Если временная таблица будет содержать более 100 rows
, тогда да, создайте кластерный индекс для нее,
CREATE CLUSTERED INDEX ix_DesignLvl
ON [#DesignLvl] ([DesignKey], [DesignLevel]);
Если вы не используете [DesignLevel]
в состоянии соединения, затем удалите из индекса.
Кроме того, покажите индекс таблицы [dbo].[Design]
и несколько данных DesignKey и ParentDesignKey.
Существует несколько причин для получения Index Scan
, одна изони равны Selectivity of Key
.
Таким образом, у одного DesignKey
может быть сколько строк, а у одного ParentDesignKey
может быть сколько строк?
Таким образом, в зависимости от ответа выше Create Composite Clustered Index
на оба ключатаблицы [dbo].[Design]
Так что считайте мой ответ неполным, я обновлю его соответственно.