T-SQL VIEW — CTE + UNPIVOT по сравнению с UNION по сравнению с другими методами

Интересно, какое решение лучше. Мне нужно объявить некоторые переменные, которые рассчитываются с использованием функций даты T-SQL (DATEADD, DATEPART, GETDATE() и т. д.).

После некоторых исследований я пишу это:

WITH DatePeriods(ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate) AS
(
    SELECT  "...date functions..." AS ThisWeek
            "...date functions..." AS LastWeek
            "...date functions..." AS MonthToDate
            "...date functions..." AS QuarterToDate
            "...date functions..." AS YearToDate
)
SELECT Desciption,Value
FROM DatePeriods
UNPIVOT
(
    Value FOR Desciption IN (ThisWeek,LastWeek,MonthToDate,QuarterToDate,YearToDate)
) AS Source

И это выглядит круто, потому что у меня есть "cte" и "unpivot". Если я хочу добавить другую переменную даты, я должен вставить только CTE.

И другое решение использует обычный «союз»:

SELECT  'ThisWeek',"...date functions..." AS ThisWeek
UNION
SELECT  'LastWeek',"...date functions..." AS LastWeek
UNION
SELECT  'MonthToDate',"...date functions..." AS MonthToDate
UNION
SELECT  'QuarterToDate',"...date functions..." AS QuarterToDate
UNION
SELECT  'YearToDate',"...date functions..." AS YearToDate

Я думаю, что это не так хорошо, потому что новая переменная даты означает новое объединение, но в конце концов объединение только между несколькими переменными.

Может ли кто-нибудь сказать мне, какой метод является хорошей практикой в ​​​​этом случае или даже предлагает другое решение?

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Это результат, который я хочу:

Desciption      Value
ThisWeek        2012-08-05 08:55:23.013
LastWeek        2012-07-29 08:55:23.013
MonthToDate     2012-07-08 08:55:23.013
QuarterToDate   2012-05-08 08:55:23.013
YearToDate      2011-08-08 08:55:23.013

person gotqn    schedule 08.08.2012    source источник
comment
вы проверили план выполнения по обоим запросам?   -  person Taryn    schedule 08.08.2012
comment
@bluefeet Да, но я не профессионал, когда дело доходит до сравнения планов выполнения. Более того, во время выполнения каждого запроса происходит много всего, но оба они выполняются за 0 секунд. И почти каждый пункт в плане стоил 0%.   -  person gotqn    schedule 08.08.2012


Ответы (1)


Если вы посмотрите на планы запросов, вы увидите, что ваша версия union имеет гораздо более высокую стоимость, чем ваша версия unpivot. Но если вместо этого вы измените на union all, это будет лучше, чем unpivot.

Если вы используете SQL Server 2008 или более позднюю версию, вы можете вместо этого использовать values, и в соответствии с планом выполнения стоимость такая же, как union all.

Версия значений:

select Description, Value
from (values ('ThisWeek',      getdate()+1),
             ('LastWeek',      getdate()+2),
             ('MonthToDate',   getdate()+3),
             ('QuarterToDate', getdate()+4),
             ('YearToDate',    getdate()+5)
     ) as T(Description, Value)

Союз всех версий:

SELECT  'ThisWeek' AS Description, getdate()+1 AS Value
UNION ALL
SELECT  'LastWeek', getdate()+2
UNION ALL
SELECT  'MonthToDate', getdate()+3 
UNION ALL
SELECT  'QuarterToDate', getdate()+4 
UNION ALL
SELECT  'YearToDate', getdate()+5

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

person Mikael Eriksson    schedule 08.08.2012