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 不同)。您使用 minvalue
和 maxvalue
从 STV_BLOCKLIST
查看它们的值的能力有限,因为 int8
直接用于计算其排序键值,因此如果您写一行进入 table,您可以通过检查其 sortkey 值来查看它的值。因此,如果您写入一行,然后是第二行,然后删除第一行,然后是 vacuum,然后假设没有发生行重新编号(实际上它很可能会这样做 - Postgres 在 vacuum 时会这样做),那么您将看到该值对于第二行。请记住使用 sortkey 列,始终具有相同的值,以将所有行保留在一个切片上,因此您添加的行实际上最终都在同一个块中。
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 不同)。您使用 minvalue
和 maxvalue
从 STV_BLOCKLIST
查看它们的值的能力有限,因为 int8
直接用于计算其排序键值,因此如果您写一行进入 table,您可以通过检查其 sortkey 值来查看它的值。因此,如果您写入一行,然后是第二行,然后删除第一行,然后是 vacuum,然后假设没有发生行重新编号(实际上它很可能会这样做 - Postgres 在 vacuum 时会这样做),那么您将看到该值对于第二行。请记住使用 sortkey 列,始终具有相同的值,以将所有行保留在一个切片上,因此您添加的行实际上最终都在同一个块中。