修复内存密集型计算列

时间:2018-05-11 13:25:13

标签: powerbi dax

我有一些包含付款数据的表格,我们需要确定哪些付款是最新的,哪些是最旧的(由付款人员划分,以及付款类型)

我们假设实现这一目标的最佳方法是使用计算列和RANKX - 但是,当我们执行重新计算时,服务器会耗尽内存 - 原因是计算列。

部分原因是我所指的表格中的记录数量(约10mil)

可能更容易看到一些模拟的例子 - 在下表中,' RANK'列是我们预期的输出。我们想要实现的是通过PersonRef和ElementID对记录进行分组 - 然后按EndDate排序 - 具有LATEST EndDate的记录的RANK为1。

+-----------+-----------+------------+------+
| PersonRef | ElementId |  EndDate   | RANK |
+-----------+-----------+------------+------+
|    123456 |      1000 | NULL       |    1 |
|    123456 |      1000 | 01/01/2017 |    2 |
|    123456 |      6010 | 31/03/2018 |    1 |
|    123456 |      6010 | 12/01/2018 |    2 |
|    789789 |       999 | NULL       |    1 |
|    789789 |       999 | 25/02/2018 |    2 |
|    789789 |       999 | 01/03/2016 |    3 |
|    789789 |      1000 | 25/02/2018 |    1 |
|    789789 |      1000 | 01/03/2016 |    2 |
+-----------+-----------+------------+------+

我们也无法在我们的SQL表中真正做到这一点,因为SSAS表是分区的,我们每5分钟只处理一次相关分区 - 如果在第1级有新条目,我们将不得不改变该人的SQL记录,这将导致所有SSAS分区被处理,这对我们来说效率太低。

我们尝试将其作为计算列,并且它的内存使用率非常高:

VAR CurrentPersonRef = 'Payment'[Person_Ref]
VAR CurrentPayElement = 'Payment'[ElementId]
RETURN
RANKX 
(
    FILTER 
    (
        'Payment',
        'Payment'[Person_Ref]= CurrentPersonRef &&
        'Payment'[ElementId] = CurrentPayElement
    ),
    IF(ISBLANK('Payment'[Pay End Date]),"2999-01-01",'Payment'[Pay End Date]), , ASC, DENSE
)

任何其他建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

I'm not positive that this will give better performance, but give it a try:

Ranked = 
    VAR EndDate = Payment[AdjEndDate]
    RETURN CALCULATE(
               RANK.EQ(EndDate, Payment[AdjEndDate], DESC),
               ALLEXCEPT(Payment, Payment[Person_Ref], Payment[ElementId]))

Where Payment[AdjEndDate] is a column that replaces the null values:

AdjEndDate = IF(ISBLANK(Payment[Pay End Date]), DATE(2999,1,1), Payment[Pay End Date])