对于我来说,这更像是一个令人困惑的问题,并且想了解原因。
我有两个表,几乎完全相同,唯一的区别是一列的数据类型和排序键。
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 of 26创建的_1表具有不同的压缩设置,第一个表也是使用14列的Composite SortKey创建的,没有排序键的情况下重新创建了该表(这是一个历史表全部)的容量降至231GB。
答案 0 :(得分:1)
这两个表的大小不同,因为根据排序键,一个表比另一个表分配了更多的块。对于更大的表,分发的方式是磁盘块未完全占用,因此需要更多的块来存储相同数量的数据。
之所以发生这种情况,是因为Redshift的块大小为1MB,以及它跨切片和节点存储数据的方式。通常,数据将基于diststyle分布在不同的节点和片上。对于您的情况,我假设这种分布是以循环方式进行的。因此slice1获得第一条记录,slice2获得第二条记录,等等。由于Redshift的最小块大小为1MB,因此每当一条新记录进入新切片时,就会分配1MB(即使该记录仅占用几个KB)。对于后续记录到同一条带,数据将进入相同的1MB块,直到有可能为止,然后在该条带上分配一个新的1MB块。但是,如果此片的第一条记录之后没有更多记录,则它仍将占用1MB大小的第一块。该表的总大小是所占用的所有块的总和(与块中当前有多少数据无关)
答案 1 :(得分:0)
表大小的差异可能是由于以下原因。
如果我做出了错误的假设,请发表评论,然后重新调整答案。
答案 2 :(得分:0)
怀疑较大的表具有不同的压缩设置或根本没有压缩。您可以使用我们的视图v_generate_tbl_ddl
来生成包含压缩设置的表DDL。
即使压缩设置相同,表大小也会因不同的排序键而异。排序键用于将数据放入磁盘上的块中。如果一种排序键将许多相似的列值放在一起,则压缩效果更好,所需空间也较小。