この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
当エントリは先日投稿したシリーズ『『Amazon Redshiftのパフォーマンスチューニングテクニック Top 10』手順実践』の第4弾です。課題#4の『統計情報が無い表、もしくはVACCUMが必要な表』について内容を見て行きたいと思います。
『課題 #4: 統計情報が無い表、もしくはVACCUMが必要な表』を実践してみる
a stats_offの項目説明には『テーブルの統計情報の古さを示す数。0 は最新で、100 は最新でないことを示します。』とあります。また、表示条件を『5以下』としていますが、一定期間で直近実行されていたものについてはここでは対象としては省く形にしているのでしょう。100に近ければ近いほど"最新では無い、VACUUM/ANALYZEすべき"であるという事で、SQLのソート条件も100に近いものが上位に来るように書き換えてみました。
SELECT
database,
schema || '.' || "table" AS "table",
stats_off
FROM
svv_table_info
WHERE
stats_off > 5
ORDER BY
stats_off DESC;
結果は以下の様になります。ここでは対象となったものの中からzzzzzzzスキーマのt_sampledataテーブルについて対処を施してみたいと思います。
database | table | stats_off
-------------+----------------------------------------+-----------
xxxxxxxxxxx | public.abcdefg | 100.00
xxxxxxxxxxx | zzzzzzz.t_sampledata | 100.00
xxxxxxxxxxx | aaaaaaa.bbbbbbb | 99.99
xxxxxxxxxxx | public.hijklmn | 99.99
:
xxxxxxxxxxx | public.aaaaaaa | 11.84
xxxxxxxxxxx | public.bbbbbbb | 10.81
(71 rows)
対処を施す、と言っても単純にVACUUMコマンドとANALYZEコマンドを実行するのみです。テーブルを指定してそれぞれ実行します。
# VACUUM zzzzzzz.t_sampledata;
VACUUM
# ANALYZE zzzzzzz.t_sampledata;
ANALYZE
実行後、対象テーブルの状況を改めて確認してみます。こちらのSQLでは条件を外してスキーマとテーブルを指定しています。stats_offの値が0になっている=統計情報が最新である事を確認出来ました。
# SELECT
database,
schema || '.' || "table" AS "table",
stats_off
FROM
svv_table_info
WHERE
svv_table_info.schema = 'zzzzzzz'
AND svv_table_info.table = 't_sampledata';
database | table | stats_off
-------------+----------------------+-----------
xxxxxxxxxxx | zzzzzzz.t_sampledata | 0.00
(1 row)
テーブル統計情報を更新する為のANALYE処理、またANALYZE処理と併せて実行・考慮される事が多いVACUUM処理の実行タイミング等については以下公式ドキュメントにその詳細が載っているのでご参照ください。大筋としては、こまめな実行を心掛けておく形が良さそうです。
また、この課題についてのユーティリティツールが以下GitHubに公開されています。こちらを活用してみるというのも手かも知れません。
まとめ
以上、『Amazon Redshiftのパフォーマンスチューニングテクニック Top 10』トピック4つめ、"ソートキーの恩恵を受けられないクエリ"に関する対処方法のご紹介でした。5つ目以降のトピックについても、こんな感じで読み解きつつ実践して行きたいと思います。