【问题标题】:Encoding a Postgres UUID in Amazon Redshift在 Amazon Redshift 中编码 Postgres UUID
【发布时间】:2019-11-08 14:37:02
【问题描述】:

我们有几个实体被持久化到 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(36)
  • 通过 varchar(38) 加入表格肯定是个坏主意?
  • 没有你想的那么糟糕。我什至会争辩说,还有更多其他因素会影响性能,这些因素会使字符串比较黯然失色。确保使用 local "C" 定义列(但不确定 Redshift 是否支持)
  • 我猜会试一试,也许可以尝试在它上面收集大量数据,看看它是否会导致问题。显然有no locale support

标签: postgresql amazon-redshift uuid


【解决方案1】:

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

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

或者,如果其中一个表相当小(

如果您已将连接放在同一位置并希望进一步优化,那么您可以尝试将 UUID 值拆分为 2 个 BIGINT 列,一个用于前 64 位,另一个用于底部 64。即使 UUID 的一半也可能是唯一的,然后您可以将第二列用作“决胜局”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多