为什么像 Snowflake 和 Redshift 这样的列式数据库不能更改列顺序?



我一直在使用Redshift,现在正在测试Snowflake。两者都是列式数据库。我读到的关于这种类型的数据库的所有内容都表明它们按列而不是按行存储信息,这有助于大规模并行处理 (MPP(。

但我也看到他们无法更改列的顺序或在现有列之间添加列(不知道其他列数据库(。添加新列的唯一方法是将其附加到末尾。如果要更改顺序,则需要使用新顺序重新创建表,删除旧顺序,然后更改新表的名称(这称为深拷贝(。但是,由于依赖关系甚至内存利用率的原因,这有时是不可能的。

我更惊讶的是,这可以在行数据库中完成,而不是在列式数据库中完成。当然,它还没有成为功能一定是有原因的,但我显然没有足够的信息。我以为这只是更改information_schema中表格的序数的问题,但显然不是那么简单。

有谁知道其中的原因?

通常,表中的列顺序不被视为第一类属性。通过按该顺序列出名称,可以按所需的任何顺序检索列。

强调表中的列顺序表明经常使用SELECT *。我强烈建议不要在没有显式LIMIT子句的情况下在列式数据库中使用SELECT *,以尽量减少影响。

如果必须更改列顺序,您可以在 Redshift 中执行此操作,方法是创建一个新的空版本的表,其中列按所需顺序排列,然后使用ALTER TABLE APPEND将数据非常快速地移动到新表中。

https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE_APPEND.html

如果不删除并重新创建列,则无法更改列的内部存储顺序。

SQL 可以按所需的任何顺序检索列。

按某些特定顺序列出列的一般要求是为了查看目的。

您可以将视图定义为所需的列顺序,并在所需的操作中使用该视图。

CREATE OR REPLACE TABLE CO_TEST(B NUMBER,A NUMBER);
INSERT INTO CO_TEST VALUES (1,2),(3,4),(5,6);
SELECT * FROM CO_TEST;
SELECT A,B FROM CO_TEST;
CREATE OR REPLACE VIEW CO_VIEW AS SELECT A,B FROM CO_TEST;
SELECT * FROM CO_VIEW;

创建视图以按所需顺序列出列不会干扰视图下的实际表,并且不会浪费与重新创建表相关的资源。

在某些数据库(尤其是 Oracle(中,对表上的列进行排序将通过在列表末尾存储 NULLable 列来影响性能。与数据块中存储的利用方式有关。

最新更新