postgresql - 在 Amazon Redshift 中编码 Postgres UUID

标签 postgresql amazon-redshift uuid

我们有几个实体被持久保存到 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 也可能会被删除。是唯一的,然后您可以使用第二列作为“决胜局”。

参见"Amazon Redshift Engineering’s Advanced Table Design Playbook: Preamble, Prerequisites, and Prioritization"

关于postgresql - 在 Amazon Redshift 中编码 Postgres UUID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58768595/

相关文章:

sql - 计算 postgres 中某个值的出现次数

sql - 在 90 天的窗口中,我有多少不同的活跃用户?

ios - NSUUID *真的* 与.Net GUID 相同吗?安卓呢?

objective-c - 在 Xcode 中生成计算机特定的 UUID

sql - 如何在 postgres INSERT ON CONFLICT DO UPDATE 中返回列的旧值?

ruby-on-rails - 如何使用docker容器连接postgres数据库

linux - Postgres 更新 - 运行命令时出现版本不匹配错误

sql - Postgres/Redshift 按状态计算最后 5 行

amazon-redshift - 使用 AWS RedshiftBasicEmitter 时出现 S3ServiceException

ios - NSUUID 重复机会来自不同的设备。