在 Amazon Redshift 中编码 Postgres UUID

Encoding a Postgres UUID in Amazon Redshift

我们有几个实体被持久化到 Amazon Redshift 中以用于报告目的,并且这些实体之间存在关系。 Postgres 中的源表通过具有 UUID 数据类型的外键关联,这在 Redshift 中不受支持。

一种选择是将 UUID 编码为 128 位有符号整数。 Redshift documentation 指的是创建 NUMBER(38,0) 的能力,以及创建 128 位数字的能力。

但是 2^128 = 340,282,366,920,938,463,463,374,607,431,768,211,456 是 39 位数字。 (感谢维基百科)。因此,无论文档怎么说,您都无法在 Redshift 中存储完整的 128 位/39 位精度。您实际上如何在 Redshift 中创建一个完整的 128 位数列?

简而言之,这背后的真正问题是 - Redshift 存储和连接具有 UUID 主键的表的最佳实践是什么?

Redshift 连接即使使用 VARCHAR 键也能很好地执行,所以这就是我要开始的地方。

联接性能的主要因素是将行共同定位到同一个计算节点上。为此,您应该将 UUID 列声明为 table 上的分布键。

或者,如果 table 之一相当小(<= ~100 万行),那么您可以将 table 声明为 DISTSTYLE ALL 并为更大 table.

如果您已将连接置于同一位置并希望进一步优化,那么您可以尝试将 UUID 值拆分为 2 个 BIGINT 列,一个用于前 64 位,另一个用于后 64 位。甚至 UUID 的一半是可能是唯一的,然后您可以将第二列用作 "tie breaker".

c.f。 "Amazon Redshift Engineering’s Advanced Table Design Playbook: Preamble, Prerequisites, and Prioritization"