為什麼 Amazon Redshift 叢集中的資料表耗用的磁碟儲存空間超過預期或更少?

2 分的閱讀內容
0

資料表佔用的磁碟空間比預期更多,或者在傳統調整大小後,可用磁碟空間的百分比沒有增加。Amazon Redshift 如何計算磁碟儲存和資料表大小?

解決方法

檢查最小資料表大小

最小資料表大小是資料表在 Amazon Redshift 叢集上的最小佔用空間。您可以在分析叢集儲存使用情況或調整 Amazon Redshift 叢集大小時,檢查最小資料表大小。

對於使用 KEY、EVEN 或 Auto (EVEN) 分佈樣式建立的資料表,請使用下列公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices * number_of_table_segments

對於使用 ALL 或 Auto (ALL) 分佈樣式建立的資料表,請使用下列公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes * number_of_table_segments

對於資料表公式,區段數量根據資料表是否具有已定義的排序索引鍵而定。如果 Amazon Redshift 資料表具有已定義的排序索引鍵,則資料表具有兩個區段:一個排序的區段和一個未排序的區段。如果 Amazon Redshift 資料表沒有排序索引鍵,則資料表只會產生一個未排序的區段。

您可以使用下列查詢計算已填入的切片數量:

select count(distinct a.slice) as
number_of_populated_slices, b."table" from stv_blocklist a,
svv_table_info b where a.tbl = b.table_id group by b."table" ;

範例:six dc2.large 叢集

例如,您可以使用四個相同結構和資料列數的小型資料表來建立 six dc2.large 叢集。如果叢集使用三種不同的分佈樣式和一種具有排序索引鍵的分佈樣式,則會使用不同的查詢。

下列查詢會建立具有 ALL 分佈樣式的資料表 (以及六個已填入切片的輸出):

create table testsize_all (a varchar(100),b varchar(100), c
varchar(100)) diststyle all;
insert into testsize_all values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

下列查詢會建立具有 EVEN 分佈樣式的資料表 (以及六個已填入切片的輸出):

create table testsize_even (a varchar(100),b varchar(100), c
varchar(100)) diststyle even;
insert into testsize_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

下列查詢會建立具有分佈索引鍵的資料表 (以及一個已填入切片的輸出):

create table testsize_key (a varchar(100),b varchar(100), c
varchar(100)) distkey (a);
insert into testsize_key values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

下列查詢會建立具有分佈索引鍵和排序索引鍵的資料表 (以及六個已填入切片的輸出):

create table testsize_sort_even (a varchar(100),b
varchar(100), c varchar(100) ) diststyle even sortkey (a);
insert into testsize_sort_even values
('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c'),('a','b','c');

計算最小資料表大小

若要計算 EVEN 分佈樣式的最小資料表大小,請使用下列公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36MB

若要計算 ALL 分佈樣式的最小資料表大小,請使用下列公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_cluster_nodes *
number_of_table_segments
1MB * (3+3) * 6 *1 = 36 MB

若要計算 KEY 分佈樣式的最小資料表大小,請使用下列公式:

Minimum table size = block_size (1 MB) * (number_of_user_columns
+ 3 system columns) * number_of_populated_slices * number_of_table_segments
1MB * (3+3) * 1 *1 = 6MB

若要計算具有排序索引鍵有 EVEN 分佈的最小資料表大小,請使用下列公式:

Minimum table size = block_size (1 MB) *
(number_of_user_columns + 3 system columns) * number_of_populated_slices *
number_of_table_segments
1MB * (3+3) * 6 *2 = 72MB

正如計算所示,插入少量資料列時,資料表的大小大於預期。資料表的大小會隨著插入的資料列數量以及填入的切片數量增加而持續成長。

執行傳統調整大小時,填入的切片數量會增加,而不會增加資料表的資料量。因此,調整大小後的可用空間量不會線性增長。


相關資訊

Amazon Redshift 設計資料表的最佳實務

使用自動資料表最佳化

單欄式儲存

選擇最佳排序索引鍵

查詢規劃和執行工作流程

AWS 官方
AWS 官方已更新 2 年前