はじめに
Redshiftのデータはnode毎に分散されており、distkeyが不適切だとnode間でデータ量が偏ることがある。
データが偏るとディスクを圧迫するだけでなくパフォーマンスにも影響する。
nodeとslice
- データはnode毎に分散して保存されている。
- さらにnode内で複数のsliceに分かれて保存されている。
node情報取得
以下のテーブルを使ってrowsの偏りを求める事ができる。
ディスク使用量(byte)は取ることはできない。
- stv_tbl_perm
- slice毎のテーブルのrows数を取得できる。
- stv_slices
- nodeとsliceのマッピング情報を取得できる。
調査クエリ
node毎の使用量を取得
select node, sum(rows)
from stv_slices m
join stv_tbl_perm s on s.slice = m.slice
group by node;
テーブルを指定してnode毎の使用量を取得
select node, max(name) as name, sum(rows) as rows
from stv_slices m
join stv_tbl_perm s on m.slice = s.slice
where name = '$TABLE_NAME'
group by node;
テーブル毎のrows数取得
select name, sum(rows) as rows
from stv_tbl_perm
group by name;
追記
svv_table_info というテーブルもある。
http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_SVV_TABLE_INFO.html
skew_rowsカラムが、「最も多くの行を含むスライスの行数と、最も少ない行を含むスライスの行数の比率。」を表しており、大きいほど偏りが大きいことを表している。