Books and articles about SQL Rambler's Top100 Сменить язык на: Русский 16 April 2024 11:08:13


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Производительность 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

На главную страницу

Print  Версия для печати


Usage of any materials of this site is possible
only under condition of mandatory allocation of the direct link to a site
http://www.sqlbooks.ru
on each page where used materials are placed.

 Main   Articles    Books 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.