当我通过CTAS(创建表AS)在一个或多个包含数百万条记录的基表的帮助下创建表时。然后我可以看到瞬态数据被保存到/ nzscratch / tmp目录或者我可以说在CTAS操作期间,nzscratch / tmp继续填充,除非它完成。一旦CTAS成功,一切都会从/ nzscratch / tmp目录中清除。
所以我想知道它是否是预期的行为?
第二件事:运行任何常规查询同样的概念是否同样适用于长时间运行还是瞬态数据在这种情况下保存到内存端?
生成瞬态数据的CTAS示例:
if (!Configure::read('debug')):
throw new NotFoundException();
endif;
相关的DDL:
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;
答案 0 :(得分:1)
一般来说,如果您的CTAS查询执行了重要的基于主机的处理(例如,使用没有PARTITION BY子句的row_number()函数,那么您应该只在/ nzscratch / tmp目录中看到瞬态数据,这是一个非常常见的错误在我看来,在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;