【问题标题】:Index or partition on SCD 2 table commonly rolled up from daily to monthly snapshotsSCD 2 表上的索引或分区通常从每日快照汇总到每月快照
【发布时间】:2016-09-12 16:04:02
【问题描述】:

我有一张非常大的桌子,每天都会装满。业务用户大多只对月度快照感兴趣(每个月按关键字段的最新记录)。

例如:

Loan_Number   Balance    Load_Date
1             $1         4/25/2016
1             $.75       2/15/2015
1             $1.50      4/13/2016
2             $2         1/1/2016
2             $2.75      4/30/2016
2             $2.50      5/05/2016
2             $2         4/15/2016
3             $3         5/05/2016
3             $3.50      5/15/2016

四月的快照是:

SELECT * 
  FROM Loan_Table
 WHERE Load_Date <= DATE '4/30/2016'
QUALIFY 
       row_number() OVER(
           PARTITION BY Loan_Number 
               ORDER BY Load_Date DESC) 
           = 1

是否有任何索引或分区结构可以添加到此表以提高性能?如果有帮助,我们正在运行 TD 14。

【问题讨论】:

  • 当前的 PI 是多少?根据您的 WHERE 条件,April 可能还包括前几个月的行?
  • @dnoeth 当前 PI 是 Loan_Number。是的,在这种情况下,如果账户余额自 2 月以来没有发生变化,就会发生这种情况。 Load_Date 实际上是系统生成的插入时间戳。仅当余额发生变化时才会加载新的贷款记录。

标签: sql query-optimization teradata database-administration


【解决方案1】:

Load_Number 上的 PI 可能是你能得到的最好的,分区不会有帮助。解释希望显示'STAT FUNCTION ...本地构建'。

但根据行数和记录大小,一个好的旧 NUSI plus MAX 可能会有所帮助:

CREATE INDEX (Loan_Number, Load_Date) ORDER BY HASH(Loan_Number) ON Loan_Table;

SELECT * 
  FROM Loan_Table AS t1
 WHERE Load_Date = 
  ( SELECT MAX(Load_Date ) 
    FROM Loan_Table AS t2
    WHERE t1.Loan_Number = t2.Loan_Number 
      AND Load_Date  <= DATE '2016-04-30'
  )

【讨论】:

  • 如果列因为 NUSI 已经排序,Teradata 是否会避免再次对数据进行排序?
  • @xenodevil:在什么情况下?这个NUSI是按Hash值排序的吗? +检查解释,可能不是。
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2016-10-26
  • 2019-01-23
  • 1970-01-01
相关资源
最近更新 更多