На главную страницу
Производительность CTE
Jerry Dixon (оригинал: CTE Performance)
Перевод Моисеенко С.И.
Я только закончил читать
статью в сети, которая утверждает, что табличные переменные могут быть вдвое
быстрей, чем CTE. Это немного смутило меня, поскольку я недавно тестировал сложную
пользовательскую функцию (UDF), которая использовала CTE вместо табличных переменных.
Версия с CTE оказалась более чем в двадцать раз быстрее! Я решил выполнить некоторые
тесты, подобные тем, что были опубликованы в цитируемой статье. Главное различие
между моими тестами и тестами в статье заключалось в том, что мой операторы CTE
и INSERT не содержали предложения WHERE. (Мне требовался большой набор данных для
этого теста.)
Тест с табличной переменной:
DECLARE @Temp TABLE (EntryDate DATETIME
,IASCommodityPK INT
,FutureMonthPK INT
,FutureYear SMALLINT
,Basis DECIMAL(7,4))
INSERT INTO @Temp
SELECT EntryDate, IASCommodityPK, FutureMonthPK, FutureYear, [Value]
FROM IASForwardPrice
SELECT
t1.Basis AS 'T1'
,t2.Basis AS 'T2'
FROM @Temp t1
INNER JOIN @Temp t2 ON t1.IASCommodityPK = t2.IASCommodityPK
AND t1.FutureMonthPK = t2.FutureMonthPK
AND t1.FutureYear = t2.FutureYear
AND t1.EntryDate = t2.EntryDate
WHERE t1.FutureMonthPK = 10 AND t1.FutureYear = 2006
Тест с CTE:
WITH Temp
AS
(
SELECT EntryDate, IASCommodityPK, FutureMonthPK, FutureYear,
[Value] AS 'Basis'
FROM IASForwardPrice
)
SELECT
t1.Basis AS 'T1'
,t2.Basis AS 'T2'
FROM Temp t1
INNER JOIN Temp t2 ON t1.IASCommodityPK = t2.IASCommodityPK
AND t1.FutureMonthPK = t2.FutureMonthPK
AND t1.FutureYear = t2.FutureYear
AND t1.EntryDate = t2.EntryDate
WHERE t1.FutureMonthPK = 10 AND t1.FutureYear = 2006
Я выполнял эти тесты на таблице, которая содержала немного более чем 50 000 строк.
Еще раз, мои результаты однозначно отдали предпочтение CTE с коэффициентом двадцать.
Анализируя планы выполнения, я обратил внимание, что тест с табличной переменной
использовал 97 % всего времени просто для загрузки данных в переменную. Тесту с
CTE это не требовалось. Фактически, план выполнения для теста с CTE не отличался
плана, созданного для теста, который непосредственно использовал исходные таблицы.
(Я проверял.) В этом сценарии табличные переменные и должны быть медленнее.
Что это означает? Ну, то, что CTE быстрее в этом конкретном случае. Это означает,
что CTE МОЖЕТ быть быстрее, чем табличные переменные. Это также означает, что Вы
должны проверить каждый метод самостоятельно, а не предполагать, что один метод
быстрее другого.
Наконец, это означает, что я никого ничему не учу :-). Я просто думаю, что это было
интересно.
16/08/2006
На главную страницу