2016-02-03 103 views
0

当我通过CTAS(创建表AS)创建一个表时,在一个或多个包含百万条记录的基表的帮助下。然后我可以看到瞬态数据被保存到/ nzscratch/tmp dir或者我可以说在CTAS操作期间,除非它完成,否则nzscratch/tmp将继续填充。一旦CTAS成功,所有东西都会从/ nzscratch/tmp目录中清除。netezza消费/ nzscratch中的CTAS操作

所以我想知道它是否是预期的行为?

第二件事:同样的概念适用于运行任何长期保持运行的正常查询,或者在这种情况下瞬态数据正在保存到内存一侧?

一个个CTA所产生的瞬态数据的例子:

CREATE TABLE T1 AS 
SELECT track_seq, 
    MAX(campaign_label) AS campaign_label, 
    MAX(creative_label) AS creative_label, 
    MAX(lob_label)  AS lob_label, 
    MAX(placement_label) AS placement_label, 
    MAX(site_label)  AS site_label 
FROM (
     SELECT * 
     FROM master_test 

     UNION 

     SELECT * 
     FROM labels_test_1 
    ) 
    a 
GROUP BY 1; 

相关DDL:

CREATE TABLE admin.master_test 
    (
     track_seq character varying(40), 
     campaign_label character varying(200), 
     creative_label character varying(200), 
     lob_label character varying(200), 
     placement_label character varying(200), 
     site_label character varying(200) 
    ) 
    DISTRIBUTE ON (track_seq) 
; 

CREATE TABLE admin.labels_test_1 
    (
     track_seq character varying(40), 
     campaign_label character varying(200), 
     creative_label character varying(200), 
     lob_label character varying(200), 
     placement_label character varying(200), 
     site_label character varying(200) 
    ) 
    DISTRIBUTE ON (track_seq) 
; 

回答

1

一般来说,你应该只看到/ nzscratch/tmp目录,如果瞬时数据您的CTAS查询会执行重要的基于主机的处理(例如,使用row_number()函数而没有PARTITION BY子句,这在我看来是在MPP平台上生成代理键的常见错误)。

如果您正在对远程系统(您的桌面或BI服务器)执行SELECT操作,那么接收系统无法跟上Netezza系统发送数据的速度时,您还可以看到使用情况。在这些情况下,你也会看到/ nzscratch中的数据。

对于您提供的特定CTAS示例,罪魁祸首是子选择中的UNION。 UNION必须提供重复检测,在这种情况下发生的事情是两个表都被发送到主机进行处理,以便所有行都可以在那里被重复删除。这就是吃掉你的/ nzscratch空间的原因。

以下是使用GROUP BY执行重复删除工作的替代方法,该工作应避免基于主机的处理,并通过在GROUP BY中指定分配列来保留MPP后端上的工作。

CREATE TABLE T1 AS 
SELECT track_seq, 
    MAX(campaign_label) AS campaign_label, 
    MAX(creative_label) AS creative_label, 
    MAX(lob_label)  AS lob_label, 
    MAX(placement_label) AS placement_label, 
    MAX(site_label)  AS site_label 
FROM (
     select * 
     from (
      SELECT * 
      FROM master_test 

      UNION ALL 

      SELECT * 
      FROM labels_test_1 
     ) 
     foo 
     group by 1,2,3,4,5,6 
    ) 
    a 
GROUP BY 1; 
+0

感谢Scott的回复。 下面的查询在/ nzscratch/tmp目录中生成大量瞬态数据AS creative_label,MAX(lob_label)AS lob_label,MAX(placement_label)AS campaign_label,MAX(creative_label)AS creative_label,MAX(lob_label)AS lob_label,MAX )AS placement_label,MAX(site_label)AS site_label FROM(SELECT * FROM master_test UNION SELECT * FROM labels_test_1)a GROUP BY 1 这里这2个基表包含500M和300M记录。 这是什么原因?我无法理解。 请帮忙。 – Kapish

+0

我猜想暂态数据来自UNION,必须进行重复检测。 master_test和labels_test_1分发了哪些列? – ScottMcG

+0

这里是表定义: CREATE TABLE admin.master_test(track_seq字符变化(40),campaign_label字符变化(200),creative_label字符变化(200),lob_label字符变化(200),placement_label字符变化(200),site_label字符变化(200))DISTRIBUTE ON(track_seq); CREATE TABLE管理员。DISTRIBUTE ON(track_seq);标签_test_1(track_seq字符变化(40),campaign_label字符变化(200),creative_label字符变化(200),lob_label字符变化(200),placement_label字符变化(200),site_label字符变化(200)根据您提供的信息, – Kapish