Redshift ROW_ID 列换行?

Redshift ROW_ID column wrapping?

Redshift 的 ROW_ID 列有点类似于 PostgreSQL 的 OID 列。 这是 table 中每个记录的“唯一”键,一个隐藏列添加到每个 table.

您是否希望 ROW_ID 在某个时候被包裹?

在 PostreSQL 中,OID 列仅为 32 位 -

OIDs are implemented using 4-byte unsigned integers. They are not unique–OID counter will wrap around at 2³²-1. OID are also used to identify data types (see /usr/include/postgresql/server/catalog/pg_type_d.h).

由于包装,PostgreSQL 中的 OID 并不是真正唯一的。

RedShift 中 ROW_ID 的规模是多少?他们预计会在某个时候被包裹起来吗?我们可以期望 ROW_ID 是唯一的吗?要单调递增?

找不到关于此的文档。

ps。 ROW_ID 至少在此处记录 https://docs.amazonaws.cn/en_us/redshift/latest/dg/c_load_compression_hidden_cols.html 但它可能已在更高版本的 Redshift 中被删除?谢谢

它是一个 int8,所以是 64 位。您可以通过 pg_attribute 检查它。系统 tables 指示 raw 编码,我认为我记得对于该列的行为方式看起来是合理的(但其他两个系统列(MVCC 列)的行为不符合 raw,我以为他们曾经被标记为 runlength)。

我想知道它是否真的被使用了,因为我相信在 Postgres 中它已被逐步淘汰,但 Redshift 最初来自 Postgres 8,我认为那时它仍在使用。

至于单调递增,我没看过,但我对此表示怀疑 - 你必须有一些中心点分发数字,这将是一个严重的瓶颈。我可能猜它就像一个 identity 列,其中每个切片独立生成数字,所以你最终得到唯一的数字,并且总是升序,但不是连续的或单调的。如果我没记错的话,您不能使用 SELECT 查询系统列(与 Postgres 不同)。您使用 minvaluemaxvalueSTV_BLOCKLIST 查看它们的值的能力有限,因为 int8 直接用于计算其排序键值,因此如果您写一行进入 table,您可以通过检查其 sortkey 值来查看它的值。因此,如果您写入一行,然后是第二行,然后删除第一行,然后是 vacuum,然后假设没有发生行重新编号(实际上它很可能会这样做 - Postgres 在 vacuum 时会这样做),那么您将看到该值对于第二行。请记住使用 sortkey 列,始终具有相同的值,以将所有行保留在一个切片上,因此您添加的行实际上最终都在同一个块中。