在 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".
我们有几个实体被持久化到 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".