在 Azure Synapse 中,是否真的不鼓励创建临时表?

问题描述

我与我的一位同事进行了很好的讨论,他提到创建临时表会降低 Azure Synapse 中的性能,因为 Synapse 首先在主节点中创建临时表,然后将它们分发到子节点。这是真的吗?他建议我创建永久表而不是临时表。

解决方法

这是不对的。临时表不一定通过控制节点漏斗。假设您要从分布在 ProductKey 上的表中进行选择,并将其加载到分布在 ProductKey 上的 #temp 表中。数据永远不会离开每个计算节点,因为它是一个分布式兼容插入。

另一方面,例如,如果您运行使用 ROW_NUMBER 函数的查询,则必须在控制节点上进行计算,然后将数据发送回计算节点进行存储在分布式临时表中。但这仅在存在某些类型的函数和某些类型的查询时才会发生。这不是常态。如果您担心某个特定查询,请将单词 EXPLAIN 添加到它的前面并将解释计划 XML 粘贴到您的问题中,以便我们可以帮助您解释它。

如果使用 SELECT INTO 语句加载 #temp 表,则无法指定表几何结构,因此它将是循环分布式列存储。通常这并不理想,因为压缩列存储需要额外的时间和内存,而且循环分配并不理想,除非没有好的分配键。通常,下一个使用循环分布式临时表的查询将重新洗牌它,因此最好在最初正确散列分配临时表。为此,请按照 here 所述执行 CTAS 语句。