NEWSニュース&ブログ

【Redshift】遅いクエリの謎を解け!性能分析入門(解決編)

この記事は最終更新から1年以上経過しています。内容が古くなっている可能性があります。

投稿日: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)


事象発生時と比較してプラン自体は変わっていなさそうですが、costrows が大幅に減っていますね。
=========================
・前回: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)を中心とした案件に従事
好きな言葉は『寝る子は育つ』