Amazon Redshift クラスターのテーブルが想定と異なるディスクストレージを消費していますが、なぜですか?

最終更新日: 2020 年 11 月 24 日

テーブルが予想よりも多くのディスク容量を占有しているか、従来のサイズ変更後に空きディスク容量の割合が増加しませんでした。Amazon Redshift はディスクストレージとテーブルサイズをどのように計算しているのですか?

解決方法

最小テーブルサイズの確認

最小のテーブルサイズは、Amazon Redshift クラスター上のテーブルが持つ最小フットプリントです。クラスターのストレージ使用状況を分析するときや、Amazon Redshift クラスターのサイズを変更するときに、最小のテーブルサイズを確認することができます。

KEY、EDEN、または Auto (EEN) 分散スタイルを使用して作成されたテーブルの場合は、次の数式を使用します。

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 テーブルに定義済みのソートキーがある場合、テーブルにはソートされたセグメントとソートされていないセグメントの 2 つのセグメントがあります。Amazon Redshift テーブルにソートキーがない場合、テーブルはソートされていないセグメントを 1 つだけ生成します。

次のクエリを使用して、入力済みスライスの数を計算できます。

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" ;

例: 6 つの dc2.large クラスター

例えば、同じ構造と行数の 4 つの小さなテーブルを使用して、6 つの dc2.large クラスターを作成できます。クラスターが 3 つの異なる分散スタイルと、ソートキーを持つ 1 つの分散スタイルを使用する場合、異なるクエリが使用されます。

次のクエリは、ALL 分散スタイル (および 6 つの入力済みスライスの出力) を持つテーブルを作成します。

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 分散スタイル (および 6 つの入力済みスライスの出力) を持つテーブルを作成します。

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');

次のクエリは、分散キー (および 1 つの入力済みスライスの出力) を持つテーブルを作成します。

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');

次のクエリは、分散キーとソートキー (および 6 つの入力済みスライスの出力) を持つテーブルを作成します。

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

ソートキーを使用して均等分散の最小テーブルサイズを計算するには、次の数式を使用します。

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

計算が示すように、少数の行を挿入すると、テーブルのサイズは予想よりも大きくなります。テーブルのサイズは、行数が挿入され、入力済みスライスの数が増加するにつれて増加し続けます。

従来のサイズ変更を実行すると、テーブルのデータ量が増加することなく、入力済みスライスの数が増加します。その結果、サイズ変更後の空き容量は直線的に増加しません。