ニュース&ブログ
【Redshift】遅いクエリの謎を解け!性能分析入門(解決編)
投稿日:2024/03/22
こんにちは!ソリューションサービス事業部の西田です。
今回は Amazon Redshift(※)の「性能劣化問題」解決 編をお届けします!
※AWS が提供するデータウェアハウスサービス。以降、Redshift。
これまでに、事象発生時間帯に怪しいクエリ(query=2018321)が存在していることが
STL_ALERT_EVENT_LOG を確認したことで明らかになりました!
また、このクエリで参照しているテーブル(test_table
)に ソートキー が
存在していないことで、Very selective query filter(非常に選択的なフィルター)が
発生していそうだ、ということも分かりましたね。
そこで今回は、実際に対処を実施(=ソートキーを作成)することで
性能が改善されるのか一緒に見ていきましょう!!
※まだ読まれていない方は、前回(以下)の記事を先にご一読いただくことをお勧めします。
・【Redshift】遅いクエリの謎を解け!性能分析入門(原因調査編)
・【Redshift】遅いクエリの謎を解け!性能分析入門(原因究明編)
※本記事でご案内する方法はあくまで一例です。
性能劣化の状況によっては、本ブログ記事に記載の対応方法よりも更に最適な
アプローチがあるかもしれないことを念頭に、ご参考ください。
対象者:
・Redshift を利用(他のデータウェアハウスサービスは対象外)
・クエリ(SQL)が管理者ユーザー(例:awsuser)で実行できること
・「自力で性能劣化問題の解決に挑戦したい!」という志しの高い方
原因の対処:
まずは簡単に前回のおさらいをしましょう。
test_table の id 列が sortkey=0 となっていることから、
id 列には現在ソートキーが存在しないことが分かりました。
【現時点の対象テーブルのソートキー有無(再掲)】
tablename | column | type | encoding | distkey | sortkey |
test_table | id | bigint | az64 |
true |
0 |
test_table | value | character varying(255) | lzo |
false |
0 |
という訳で、早速 ソートキー を実際に作成してみて、
本当に性能が改善されるのか見ていきましょう!
ALTER TABLE test_table ALTER SORTKEY ("id");
【構文参考】ALTER TABLE – Amazon Redshift
※本番環境でソートキーを作成する際はご注意ください!
該当テーブルに関連するクエリ性能への影響が出るため、事前にテストを行うことを推奨します。
また、Redshift 上では多少の負荷や対象テーブルに対するロックが発生することが想定されます。
そのため、一般ユーザーが利用する時間帯に実施することは避けた方が無難でしょう。
↑のコマンドを実行しましたら、ソートキーが追加されたか確認してみます。
SELECT tablename, "column", type, encoding, distkey, sortkey
FROM pg_table_def
WHERE tablename = 'test_table'; -- クエリプランで確認したテーブル名を指定
tablename | column | type | encoding | distkey | sortkey |
test_table | id | bigint | az64 |
true |
1 |
test_table | value | character varying(255) | lzo |
false |
0 |
sortkey 列の値(前回:0)が 1 に変わったことが確認できたので、
ちゃ~んと id 列にソートキーが作成できたようです!
「対処やったから、これでおしまい(きっと改善されたでしょう)」ではありませんよ!
ちゃんと結果まで確認するのが、プロってもんです!知らんけど。
改めて、問題が発生したクエリ(select * from test_table where id =1 limit 100)を実行し、
性能が改善されているか、ちゃんと見てみましょう。
select * from test_table where id =1 limit 100;
id | value |
1 | Test Value 0000000001 |
→ Elapsed time: 7ms(クエリエディターの画面右下に表示)
一瞬にして、結果が返ってきました!
事象発生時は 6秒 程度でしたが、ソートキー作成後はなんと 7ミリ秒 に!!
(計算は苦手ですが、ざっと 800倍 以上速くなってそうです!マジカヨ)
最後に、改善されたクエリのクエリプランも拝見しておきましょうか。
今回はリアルタイムのものが見てみたいので、EXPLAIN を使います。
EXPLAIN select * from test_table where id =1 limit 100;
sqlplan |
—– Update statistics by running the ANALYZE command on these tables —– —– Tables missing statistics: test_table —– XN Limit (cost=0.00..250.00 rows=100 width=408) -> XN Seq Scan on test_table (cost=0.00..0.01 rows=1 width=33)Filter: (id = 1) |
【事象発生時(再掲)】
sqlplan |
—– Update statistics by running the ANALYZE command on these tables —– —– Tables missing statistics: test_table —– XN Limit (cost=0.00..0.01 rows=1 width=33) -> XN Seq Scan on test_table (cost=0.00..125000.00 rows=50000 width=408) Filter: (id = 1) |
事象発生時と比較してプラン自体は変わっていなさそうですが、cost や rows が大幅に減っていますね。
=========================
・前回:cost=0.00..125000.00 rows=50000
↓
・今回:cost=0.00..0.01 rows=1
=========================
状況からして、今回は ソートキー の作成による効果が絶大だったと言えそうです!
見事解決!!
まとめ:
ということで、
問題となっている クエリ および 原因 を特定し、STL_ALERT_EVENT_LOG の提案通りに
対処(ソートキーの追加)を行ったことで、無事に一件落着できました!めでたし×2
具体的な例をもとに解説してみましたので、クエリの 性能劣化 問題に対する
原因特定 から 対処 までのイメージが、少しは沸いてきたのではないでしょうか!?
些細な内容かと思いますが、Redshift をご利用の方々に少しでもお役に立てましたら幸いです。
なお、こういった性能劣化に対するアプローチも含め、クラウド(AWS、Azure)や
データベース(Oracle、SQL Server、PostgreSQL など)のコンサルティングなども
弊社 ソリューションサービス事業部 では承っております!
弊社に「頼んでみようかな~」と少しでもご興味を持っていただけましたら、
お気軽にお問い合わせください♪
それではまた、次の記事でお会いしましょう!
西田 幸平(2021年入社)
株式会社システムサポート フューチャーイノベーション事業本部 ソリューションサービス事業部所属
DB(Oracle Database, SQL Server 等)やクラウド(Azure, AWS)を中心とした案件に従事
好きな言葉は『寝る子は育つ』