我们有几个实体被持久保存到 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 主键的表的最佳实践是什么?
最佳答案
即使使用 VARCHAR 键,Redshift 连接也会表现良好,所以这就是我要开始的地方。
连接性能的主要因素是将行共同定位到同一计算节点上。要实现此目的,您应该将 UUID 列声明为两个表上的分配键。
或者,如果其中一个表相当小(<= ~100 万行),那么您可以将该表声明为 DISTSTYLE ALL 并为较大的表选择其他一些 dist 键。
如果您已将连接放在同一位置并希望进一步优化,那么您可以尝试将 UUID 值拆分为 2 个 BIGINT 列,一列用于顶部 64 位,另一列用于底部 64 位。甚至一半的 UUID 也可能会被删除。是唯一的,然后您可以使用第二列作为“决胜局”。
关于postgresql - 在 Amazon Redshift 中编码 Postgres UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58768595/