【问题标题】:T-SQL VIEW - CTE + UNPIVOT versus UNIONs versus other tehniqueT-SQL VIEW - CTE + UNPIVOT 与 UNION 与其他技术
【发布时间】:2012-08-05 15:41:54
【问题描述】:

我想知道哪种解决方案更好。我必须在视图中声明一些变量,这些变量是使用 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

【问题讨论】:

  • 你检查过这两个查询的执行计划了吗?
  • @bluefeet 是的,我有,但在比较执行计划时我并不是真正的专家。更重要的是,在每个查询的执行过程中都会发生很多事情,但它们都执行了 0 秒。而且计划中几乎每一项的成本都是 0%。

标签: tsql view union common-table-expression unpivot


【解决方案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

unionunion all 慢的原因是因为它试图从结果集中删除重复项,其中union all 合并所有行而不管值如何。

【讨论】:

    猜你喜欢
    • 2015-09-04
    • 2011-12-12
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多