データスキューまたは未ソート行のあるテーブルの特定 - Amazon Redshift

データスキューまたは未ソート行のあるテーブルの特定

次のクエリは、データ分散が均等でない (データスキュー) テーブルや、未ソート行の割合が多いテーブルを特定します。

skew 値が小さい場合、テーブルデータが適切に分散されていることを示します。テーブルの skew 値が 4.00 以上の場合、データ分散スタイルを変更することを検討してください。詳細については、「十分最適でないデータ分散」を参照してください。

テーブルの pct_unsorted 値が 20 パーセントを超える場合、VACUUMコマンドの実行を検討します。詳細については、「未ソート行または正しくソートされていない行」を参照してください。

各テーブルの mbytes 値と pct_of_total 値も見直してください。これらの列は、テーブルのサイズと、raw ディスクスペースに対してテーブルが消費しているスペースの割合を示します。raw ディスク容量には、Amazon Redshift が内部用に予約するスペースの分も含まれます。このため、ユーザーが利用できるディスク容量として表示される名目上のディスク容量より大きな数字になります。この情報をもとに、最も大きいテーブルの 2.5 倍以上の空きディスク容量があることを確認します。このスペースがあれば、システムは複雑なクエリの処理時に中間結果をディスクに書き込むことができます。

select trim(pgn.nspname) as schema, trim(a.name) as table, id as tableid, decode(pgc.reldiststyle,0, 'even',1,det.distkey ,8,'all') as distkey, dist_ratio.ratio::decimal(10,4) as skew, det.head_sort as "sortkey", det.n_sortkeys as "#sks", b.mbytes, decode(b.mbytes,0,0,((b.mbytes/part.total::decimal)*100)::decimal(5,2)) as pct_of_total, decode(det.max_enc,0,'n','y') as enc, a.rows, decode( det.n_sortkeys, 0, null, a.unsorted_rows ) as unsorted_rows , decode( det.n_sortkeys, 0, null, decode( a.rows,0,0, (a.unsorted_rows::decimal(32)/a.rows)*100) )::decimal(5,2) as pct_unsorted from (select db_id, id, name, sum(rows) as rows, sum(rows)-sum(sorted_rows) as unsorted_rows from stv_tbl_perm a group by db_id, id, name) as a join pg_class as pgc on pgc.oid = a.id join pg_namespace as pgn on pgn.oid = pgc.relnamespace left outer join (select tbl, count(*) as mbytes from stv_blocklist group by tbl) b on a.id=b.tbl inner join (select attrelid, min(case attisdistkey when 't' then attname else null end) as "distkey", min(case attsortkeyord when 1 then attname else null end ) as head_sort , max(attsortkeyord) as n_sortkeys, max(attencodingtype) as max_enc from pg_attribute group by 1) as det on det.attrelid = a.id inner join ( select tbl, max(mbytes)::decimal(32)/min(mbytes) as ratio from (select tbl, trim(name) as name, slice, count(*) as mbytes from svv_diskusage group by tbl, name, slice ) group by tbl, name ) as dist_ratio on a.id = dist_ratio.tbl join ( select sum(capacity) as total from stv_partitions where part_begin=0 ) as part on 1=1 where mbytes is not null order by mbytes desc;