如何优化 Netezza 中的表以补充日期条件的联接

Posted

技术标签:

【中文标题】如何优化 Netezza 中的表以补充日期条件的联接【英文标题】:How to optimise tables in Netezza to compliment a join with date conditions 【发布时间】:2016-03-17 01:06:30 【问题描述】:

我有两张表需要加入 Netezza,其中一张非常大

我有一个维度表,它是一个客户表,它有两个字段,客户 ID 和观察日期,即

cust_id, obs_date
'a','2015-01-05'
'b','2016-02-03'
'c','2014-05-21'
'd','2016-01-31'

我有一个事务性且容量非常大的事实表。每个客户每个日期都有很多交易,即

cust_id, tran_date, transaction_amt
'a','2015-01-01',1
'a','2015-01-01',2
'a','2015-01-01',5
'a','2015-01-02',7
'a','2015-01-02',2
'b','2016-01-02',12

两个表都由同一个键 - cust_id 分布

但是,当我加入表格时,我需要在给定日期条件的情况下加入。当我将它们连接在一起时,查询非常快,但是当我添加日期条件时,它似乎没有得到优化。有没有人有关于如何设置基础表或编写联接的提示?

即sum transaction_amt 为每个客户在截至 obs_date 的 3 个月内的所有交易

FROM CUSTOMER_TABLE
INNER JOIN TRANSACTION_TABLE
ON CUSTOMER_TABLE.cust_id = TRANSACTION_TABLE.cust_id
  AND TRANSACTION_TABLE.TRAN_DATE BETWEEN CUSTOMER_TABLE.OBS_DATE - 30   AND CUSTOMER_TABLE.OBS_DATE

【问题讨论】:

【参考方案1】:

如果您的事务表足够大,使用CBTs 可能会受益。

如果可以的话,创建一个使用TRAN_DATE 组织的表的副本(我猜你的ddl 在这里):

create table transaction_table (
  cust_id varchar(20)
  ,tran_date date
  ,transaction_amt numeric(10,0)
) distribute on (cust_id)
organize on (tran_date);

加入其中,看看性能是否有所提高。您也可以仅对这些列使用物化视图,但我认为 CBT 在这里会更有用。

正如 Scott 在下面的 cmets 中提到的,您应该按插入的日期排序或在之后整理记录以确保它们被适当地排序。

【讨论】:

也许还提到了剪辑定义后所有需要的初始修饰记录。 我说的是创建另一个表的副本;但是,是的,如果您重新组织而不是创建/插入,则需要整理记录。如果表足够大,复制它可能会让人望而却步。 即使您进行了创建/插入,您也需要在进行插入时进行修饰或排序,以便获得区域地图的好处。 我明白了。你是绝对正确的。否则,cbt 不会排序。

以上是关于如何优化 Netezza 中的表以补充日期条件的联接的主要内容,如果未能解决你的问题,请参考以下文章

检查 Netezza 中的日期值

如何查询具有基数的表以显示所有 Pk,同时还显示具有 FK 的表中的匹配元素

如何在 SQL Server 中填充我的日期维度表以获得具有此特定值的列?

如何更改现有表以在 Oracle 中创建范围分区

如何在 Netezza 中比较日期?

如何优化 1Gb 大小 250k+ 行的 Mysql 表以获得更好的性能