如何在directquery模式下有效地处理MAX(日期)?

时间:2017-10-31 15:20:09

标签: sql sql-server-2016 dax ssas-tabular

背景:

  • 针对SQL RDBMS和SSAS表格的Tableau和Power BI报表服务器(Sql Server 2016)
  • 非规范化数据表。目前约有100万条记录。

挑战:

Analyst进行需要MAX(datecol)的计算

在DAX中,在directquery模式下,这似乎无法实现,因此我将其推回到ETL并添加了MaxDate列。

现在这是一张大桌子,并且日渐变大。 DTA提出了一个列存储索引,这对我来说很有意义。但该索引建议仅基于SELECT查询。我还会有插入和删除(每日批处理),然后必须跟着它们:

UPDATE table SET MaxDate = MAX(Datecol)

我的直觉是,这对列存储索引不太好,但我还没有测试过它。也许取决于是集群还是非集群?

我说MaxDate必须在ETL中处理吗?在DirectQuery模式下尝试在DAX中执行会导致错误。

我是否认为必须注意列存储索引?或者它根本没有意义,因为索引重建是必要的?

我正在寻找一条有意义并避免问题的前进道路。

1 个答案:

答案 0 :(得分:0)

使用MAXA()功能定义您的度量。 我可以使用Tabular 2016以DirectQuery模式工作。

Max Date:=MAXA(table[datecol])

发给SQL Server的查询是这样的:

SELECT MAX([t0].[DateCol]) AS [a0] FROM ((SELECT * FROM table)) AS [t0]

如果您需要将值放在列中,则无法在直接查询模式下使用MAXA()(此刻),因此我建议您修改表以使用查询作为源而不是直接表参考。

SELECT table.*,
       max_date= (SELECT MAX(datecol) FROM dbo.table)
  FROM dbo.table

如果您愿意,可以创建计算列:

days_offset = DATEDIFF(table[datecol], table[max_date], DAY)

*请注意,您无法使用分号终止语句,因为只要引擎构建对数据库的查询,它就会在子查询中使用。

如果表具有列存储索引,或者列具有非群集的行存储索引,则获取MAX(datecol)的子查询应该非常有效。比使用新的最大日期每天更新表格中的每一行要有效得多。