メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

テーブルを分析する

クエリプランナーで最適な計画の構築と選択に使用される統計メタデータを定期的に更新することをお勧めします。それを行うには、テーブルを分析します。

ANALYZE コマンドを明示的に実行することで、テーブルを分析できます。

概要

COPY コマンドでデータをロードするとき、STATUPDATE オプションを ON に設定し、分析を自動的に実行できます。デフォルトでは、COPY コマンドは空のテーブルにデータをロードした後に分析を実行します。STATUPDATE を ON に設定すれば、テーブルが空であるかどうかに関係なく、分析を強制できます。STATUPDATE に OFF を指定した場合、分析は実行されません。

テーブルの所有者とスーパーユーザーのみが ANALYZE コマンドまたは STATUPDATE を ON に設定した COPY コマンドを実行できます。

データの初回ロード後に分析されなかった新しいテーブルにクエリを実行する場合、警告メッセージが表示されます。ただし、後続の更新またはロード後にテーブルにクエリを実行した場合、警告は発生しません。分析されていないテーブルを含むクエリに EXPLAIN コマンドを実行すると、同じ動作が発生します。

空ではないテーブルにデータを追加し、テーブルのサイズが大幅に変わった場合、ANALYZE コマンドを実行するか、STATUPDATE オプションを ON に設定して COPY コマンドを実行することで統計を更新することをお勧めします。最後の ANALYZE 以降に挿入または削除された行数の詳細を表示するには、PG_STATISTIC_INDICATOR システムカタログテーブルに対してクエリを実行します。

非効率なデータストレージまたはデータの統計プロファイルの大幅な変更の結果としてパフォーマンスが低下した場合、分析を実行し、統計を更新すれば問題が解消されるかどうかを確認します。

統計を構築または更新する必要がある場合、次のいずれかに対して ANALYZE コマンドを実行します:

  • 現在のデータベース全体

  • 1 つのテーブル

  • 1 つのテーブルの 1 つまたは複数の特定の列

ANALYZE コマンドを実行すると、テーブルからサンプルの行が取得され、いくつかの計算が行われ、結果的に生成される列の統計が保存されます。デフォルトでは、Amazon Redshift は DISTKEY 列にサンプルパスを実行し、テーブルのその他すべての列に別のサンプルパスを実行します。列のサブセットの統計を生成するには、カンマ区切りの列リストを指定します。

ANALYZE 操作はリソースを集中的に使います。そのため、実際に統計更新を必要とするテーブルと列にのみ実行します。定期的に、または同じスケジュールですべてのテーブルのすべての行を分析する必要はありません。データが大幅に変更される場合、次で頻繁に使用される列を分析します。

  • ソートおよびグループ化の操作

  • 結合

  • クエリ述語

処理時間を短縮し、システムの全体的なパフォーマンスを向上させるために、Amazon Redshift は、変更された行の割合が低いテーブルの分析をスキップします。この動作は analyze_threshold_percent パラメータで決定されます。デフォルトでは、分析のしきい値は 10 パーセントに設定されます。SET コマンドを実行して、現在のセッションの分析のしきい値を変更できます。

頻繁に分析する必要のない列は、大きな VARCHAR 列など、実際に問い合わされることがない事実、単位、関連属性を表す列です。例えば、TICKIT データベースの LISTING テーブルについて考えてみます。

Copy
select "column", type, encoding, distkey, sortkey from pg_table_def where tablename = 'listing'; column | type | encoding | distkey | sortkey ---------------+--------------------+----------+---------+--------- listid | integer | none | t | 1 sellerid | integer | none | f | 0 eventid | integer | mostly16 | f | 0 dateid | smallint | none | f | 0 numtickets | smallint | mostly8 | f | 0 priceperticket | numeric(8,2) | bytedict | f | 0 totalprice | numeric(8,2) | mostly32 | f | 0 listtime | timestamp with... | none | f | 0

このテーブルに大量の新しいレコードが毎日ロードされる場合、結合キーとしてクエリで頻繁に使用される LISTID 列を定期的に分析する必要があります。TOTALPRICE と LISTTIME が頻繁に使用されるクエリの制約である場合、平日は毎日、それらの列と分散キーを分析することがあります。

Copy
analyze listing(listid, totalprice, listtime);

アプリケーションの販売者とイベントが非常に静的であり、日付 ID がわずか 2 年または 3 年をカバーする固定日数セットを参照する場合、一意の値別のインスタンス数が徐々に増えるとしても、それらの列の一意の値が大幅に変更されることはありません。また、TOTALPRICE 列に比べて、NUMTICKETS および PRICEPERTICKET 単位に頻繁にクエリが実行される場合、週末ごとに 1 回、テーブル全体に ANALYZE コマンドを実行し、毎日は分析されない 5 つの列の統計を更新することがあります。

Copy
analyze listing;

テーブルの現在の統計を維持するには、以下の手順を実行します。

  • クエリを実行する前に ANALYZE コマンドを実行します。

  • 定期的なロードまたは更新サイクルが終わるたびに、データベースに ANALYZE コマンドを定期的に実行します。

  • 作成した新しいテーブルと大幅に変更された既存のテーブルまたは列に ANALYZE コマンドを実行します。

  • クエリでの使用と変更傾向に基づき、異なるタイプのテーブルおよび列に対し、異なるスケジュールで ANALYZE 操作を実行することを考慮します。