netezza更新声明需要很长时间和高资源,需要替代方案

时间:2016-01-22 17:38:51

标签: performance time sql-update netezza

完全披露,我会认为自己仍然在"初学者"编码阶段,所以请放轻松。我试图根据来自单独表格的条件更新一个非常大的表:

UPDATE table1 A
SET A.flag1 = 'RE' WHERE EXISTS 
(SELECT B.CUSTOMER FROM ALL_CUST B 
WHERE A.CUSTOMER = B.CUSTOMER 
AND B.DAY < (A.DAY - 365));

问题是,由于每个表的大小(我认为),这需要大量的内存和时间才能完成。我正在寻找替代我尝试使用的方法。我已经研究了批量运行语句,因为它与我使用的小表一起工作得很好,但是我无法弄清楚如何使它工作。

如果需要,以下是用于创建更新的其他表:

CREATE table table1 AS
SELECT CUSTOMER,
DAY,
'NW' AS FLAG1,
'NW' AS flag2
FROM database
WHERE CUSTOMER > -1
and othercriteria 
GROUP BY CUSTOMER,
Day;

CREATE table all_cust AS
SELECT CUSTOMER,
DAY,
FROM database
WHERE CUSTOMER > -1
and othercriteria 
GROUP BY CUSTOMER,
Day;

2 个答案:

答案 0 :(得分:0)

Netezza中的更新速度可能会很慢,尤其是在添加复杂性时。我有时会发现将更改记录移动到临时表更快,删除我要替换的记录,&amp;最后从临时表中移回记录。话虽如此。我认为以下更改将加快您尝试运行的更新。

UPDATE table1
SET flag1 = 'RE'
where rowid in
(SELECT distinct A.rowid
FROM ALL_CUST B inner join
 table1 A
on A.CUSTOMER = B.CUSTOMER
AND B.DAY < (A.DAY - 365));

答案 1 :(得分:0)

我最终需要在每个基表的末尾添加一个'distribute on(customer)'语句。这样可以防止客户在我们的磁盘中随机存放效率低下,并将更新语句从几小时更改为秒。