Amazon redshift 红移表大小

Amazon redshift 红移表大小,amazon-redshift,Amazon Redshift,这对我来说更像是一个令人困惑的问题,我想知道为什么 我有两个表,几乎相同,唯一的区别是一列的数据类型和sortkey table mbytes rows stg_user_event_properties_hist 460948 2378751028 stg_user_event_properties_hist_1 246442 2513860837 尽管它们的行数几乎相同,但大小几乎是原来的两倍 以下是表格结构

这对我来说更像是一个令人困惑的问题,我想知道为什么

我有两个表,几乎相同,唯一的区别是一列的数据类型和sortkey

table                             mbytes    rows
stg_user_event_properties_hist    460948    2378751028
stg_user_event_properties_hist_1  246442    2513860837
尽管它们的行数几乎相同,但大小几乎是原来的两倍

以下是表格结构

stg.stg_user_event_properties_hist
(
id                bigint,
source            varchar(20),
time_of_txn       timestamp,
product           varchar(50),
region            varchar(50),
city              varchar(100),
state             varchar(100),
zip               varchar(10),
price             integer,
category          varchar(50),
model             varchar(50),
origin            varchar(50),
l_code            varchar(10),
d_name            varchar(100),
d_id              varchar(10),
medium            varchar(255),
network           varchar(255),
campaign          varchar(255),
creative          varchar(255),
event             varchar(255),
property_name     varchar(100),
property_value    varchar(4000),
source_file_name  varchar(255),
etl_batch_id      integer,
etl_row_id        integer,
load_date         timestamp       
);



stg.stg_user_event_properties_hist_1
(
id                bigint,
source            varchar(20),
time_of_txn       timestamp,
product           varchar(50),
region            varchar(50),
city              varchar(100),
state             varchar(100),
zip               varchar(10),
price             integer,
category          varchar(50),
model             varchar(50),
origin            varchar(50),
l_code            varchar(10),
d_name            varchar(100),
d_id              varchar(10),
medium            varchar(255),
network           varchar(255),
campaign          varchar(255),
creative          varchar(255),
event             varchar(255),
property_name     varchar(100),
property_value    varchar(4000),
source_file_name  varchar(255),
etl_batch_id      integer,
etl_row_id        varchar(20),
load_date         timestamp
);
差异同样
etl_row_id
在_1中有数据类型varchar(20),在另一个表中有整数,并且第一个表在源列上有一个sortkey

尺寸差异的原因是什么

更新:
问题在于压缩键和排序键,尽管使用CTAS 11(共26个)创建的1个表具有不同的压缩设置,但第一个表也是使用14列的复合SortKey创建的,重新创建的表没有排序键(毕竟它是一个历史表)大小降低到231GB。

表大小的差异可能是由于以下原因

  • 用于每列的编码。(查询PG_TABLE_DEF)
  • 用于表的分发键。(查询PG_TABLE_DEF)
  • 在桌子上进行真空试验。(查询SVV_真空_摘要)

如果我做了一个错误的假设,请评论,我将重新关注我的答案。

这两个表的大小不同,因为一个表根据排序键分配的块比另一个多。对于更大的表,分布的方式是磁盘块没有被完全占用,因此需要更多的块来存储相同数量的数据


这是因为红移的1MB块大小以及它跨片和节点存储数据的方式。通常,数据会基于diststyle分布在不同的节点和切片上。对于你的情况,我假设这种分布是以循环方式发生的。因此,slice1获取第一条记录,slice2获取第二条记录,等等。由于红移的最小块大小为1MB,因此每次新记录转到新切片时,都会分配1MB(即使该记录只占用几KBs)。对于同一片的后续记录,数据将进入同一1MB块,直到有可能,然后在片上分配一个新的1MB块。但是,如果在该片的第一条记录之后没有更多的记录,则它仍然占据1MB大小的第一个块。表的总大小是被占用的所有块的总和(无论块中存在多少数据)

怀疑较大的表有不同的压缩设置或根本没有压缩。您可以使用我们的视图生成包含压缩设置的表DDL


即使使用相同的压缩设置,表格大小也可能因排序键的不同而不同。排序键用于将数据放入磁盘上的块中。如果一个排序键将许多相似的列值放在一起,则压缩效果会更好,所需空间也会更少。

您是否在两个表上运行了
VACUUM
以删除删除/更新的行?请将{{tablename}真空化到100%。然后还请显示每个列的压缩。是的,在我发布问题之前,两个表都已清空。我无法找到列级压缩信息的位置,任何查询都会有帮助@jonscottf由于某些原因,表中没有行,并且您在回答中提到了有关表的视图。只是为了澄清我的用户是超级用户。@mdem7-什么是
显示搜索路径返回?您的模式应该在这里可见。如果没有,您需要包括您的模式。感谢您为视图提供的链接,它非常有用,以及您创建的其他视图。问题在于压缩键和排序键,尽管使用CTAS 11(共26个)创建的1个表具有不同的压缩设置,但第一个表也是使用14列的复合SortKey创建的,重新创建的表没有排序键(毕竟它是一个历史表)大小下降到231GB。在没有任何解释的情况下获得否决票真是太烦人了。如果您阅读了答案,那么这是一个完全有效的场景,许多人在生产过程中都遇到过这种情况。仅仅因为OP的表格不是这样,并不意味着这个答案是错误的,应该被否决。