メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012年12月1日)

テーブル設計の分析

前のセクションで示したように、ソートキー、分散キー、および列エンコードを指定することにより、ストレージ、I/O、およびクエリパフォーマンスが大幅に改善される可能性があります。このセクションでは、これらのオプションがないか、または低レベルのパフォーマンスを示すテーブルを識別するために実行できる SQL スクリプトを紹介します。

次のコードをコピーして貼り付け、table_inspector.sql という名前の SQL スクリプトを作成してから、スーパーユーザーとして SQL クライアントアプリケーションでスクリプトを実行します。

Copy
SELECT SCHEMA schemaname, "table" tablename, table_id tableid, size size_in_mb, CASE WHEN diststyle NOT IN ('EVEN','ALL') THEN 1 ELSE 0 END has_dist_key, CASE WHEN sortkey1 IS NOT NULL THEN 1 ELSE 0 END has_sort_key, CASE WHEN encoded = 'Y' THEN 1 ELSE 0 END has_col_encoding, CAST(max_blocks_per_slice - min_blocks_per_slice AS FLOAT) / GREATEST(NVL (min_blocks_per_slice,0)::int,1) ratio_skew_across_slices, CAST(100*dist_slice AS FLOAT) /(SELECT COUNT(DISTINCT slice) FROM stv_slices) pct_slices_populated FROM svv_table_info ti JOIN (SELECT tbl, MIN(c) min_blocks_per_slice, MAX(c) max_blocks_per_slice, COUNT(DISTINCT slice) dist_slice FROM (SELECT b.tbl, b.slice, COUNT(*) AS c FROM STV_BLOCKLIST b GROUP BY b.tbl, b.slice) WHERE tbl IN (SELECT table_id FROM svv_table_info) GROUP BY tbl) iq ON iq.tbl = ti.table_id;

次のサンプルは、データスキューの影響を示す 2 つのサンプルテーブル: SKEW1 と SKEW2 とともにスクリプトを実行した際の結果を示しています。

Copy
| | | |has_ |has_ |has_ |ratio_skew|pct_ | | |size_|dist_ |sort_|col_ |_across_ |slices_ schemaname|tablename|tableid|in_mb|key |key |encoding|slices |populated ----------+---------+-------+-----+------+-----+--------+----------+--------- public |category |100553 | 28 | 1 | 1 | 0 | 0 | 100 public |date |100555 | 44 | 1 | 1 | 0 | 0 | 100 public |event |100558 | 36 | 1 | 1 | 1 | 0 | 100 public |listing |100560 | 44 | 1 | 1 | 1 | 0 | 100 public |nation |100563 | 175 | 0 | 0 | 0 | 0 | 39.06 public |region |100566 | 30 | 0 | 0 | 0 | 0 | 7.81 public |sales |100562 | 52 | 1 | 1 | 0 | 0 | 100 public |skew1 |100547 |18978| 0 | 0 | 0 | .15 | 50 public |skew2 |100548 | 353 | 1 | 0 | 0 | 0 | 1.56 public |venue |100551 | 32 | 1 | 1 | 0 | 0 | 100 public |users |100549 | 82 | 1 | 1 | 1 | 0 | 100 public |venue |100551 | 32 | 1 | 1 | 0 | 0 | 100

次のリストは、TEMP_TABLES_REPORT の列についての説明です。

has_dist_key

テーブルに分散キーが存在するかどうかを示します。1 はキーが存在することを示し、0 はキーが存在しないことを示します。たとえば、nation には分散キーがありません。

has_sort_key

テーブルにソートキーが存在するかどうかを示します。1 はキーが存在することを示し、0 はキーが存在しないことを示します。たとえば、nation にはソートキーがありません。

has_column_encoding

テーブルのいずれかの列に対して圧縮エンコードが定義されているかどうかを示します。1 は、少なくとも 1 つの列にエンコードが定義されていることを示します。0 は、エンコードが定義されていないことを示します。たとえば、region には圧縮エンコードが定義されていません。

ratio_skew_across_slices

データ分散スキューの表示。値が小さいほど結果は良好です。

pct_slices_populated

入力されているスライスの割合。値が大きいほど結果は良好です。

重大なデータ分散スキューが存在するテーブルでは、ratio_skew_across_slices 列の値が大きいか、または pct_slices_populated 列の値が小さくなっています。そのような場合は、適切な分散キー列を選択していないことを意味します。上記の例では、SKEW1 テーブルのスライス全体に .15 のスキュー比率が存在しますが、必ずしも問題とは限りません。もっと重大なのは、SKEW2 テーブルについて、入力されているスライスの値が 1.56% であることです。このように小さな値は、SKEW2 テーブルの分散キーが正しくないことを意味します。

新しいテーブルをデータベースに追加したか、またはテーブルを大きく変更した場合は、必ず table_inspector.sql スクリプトを実行してください。