PostgreSQLクエリが遅い理由を知りたいですか?次に、EXPLAINANALYZEは素晴らしい出発点です。ただし、クエリプランは他のサーバーアクティビティに依存する可能性があり、実行に時間がかかる可能性があり、時間の経過とともに変化する可能性があるため、最も遅いクエリの実際の実行プランを確認する場合は、auto_explainが必要なツールです。この投稿では、その機能、構成方法、およびそれらのログを使用してクエリを高速化する方法について説明します。
auto_explainとは何ですか?
auto_explainはPostgreSQLの拡張機能であり、(構成可能な)しきい値よりも遅いクエリのクエリプランをログに記録できます。これは、遅いクエリ、特に問題が発生することがあるクエリのデバッグに非常に役立ちます。これはコントリビューションモジュールの1つであるため、通常のPostgreSQLに簡単にインストールおよび構成でき、非常に便利なので、ScaleGridでデフォルトでオンになっています。
auto_explain(commit、thread)の最初のバージョンの作成者である板垣隆宏氏、最初のパッチと提案に基づいたDean Rasheed氏、そして多くの人に感謝します。それ以来、寄稿者とレビューア。
どのauto_explainパラメータを使用する必要がありますか?
以下で最も重要なパラメータについて説明しますが、追跡できるすべての項目の詳細については、以下の表または公式ドキュメントを確認してください。
auto_explainの最も重要なパラメーターは、 log_min_duration
です。 。デフォルトでは、これは -1
に設定されています 、つまり何もログに記録されないため、ログが必要な場合は変更する必要があります。デフォルトの単位はmsであるため、 100
の設定 100ミリ秒を超えるすべてのクエリのクエリプランをログに記録します。これはScaleGridでデフォルトとして選択したものですが、[管理]->[構成]で構成できます。何らかの理由で、すべてのクエリのクエリプランをログに記録する場合は、これを 0
に設定できます。 –ただし、これはパフォーマンスに深刻な影響を与える可能性があることに注意してください。
クエリはすでにサーバーで実行されているため、 auto_explain.log_analyze
も有効にすることをお勧めします。 。これにより、出力は EXPLAIN ANALYZE
の実行と同等になります。 。デフォルトでは、操作ごとのタイミングが追跡されることも意味します。これには追加のオーバーヘッドが伴いますが、 auto_explain.log_timing
をオフにすることで最小限に抑えることができます (デフォルトでは log_analyze
でオンになります )。ただし、当然ながら、操作ごとのタイミングは、遅いクエリをデバッグするときに非常に役立ちます。内部テストでは、これに対して許容できるオーバーヘッドが示されたため、ScaleGridではデフォルトでオンになっていますが、これまでどおりワークロードをテストして、オーバーヘッドが許容できるかどうかを確認してください。現在、このトピックに関して公開されている情報は限られていますが、pgMustardチームによる最近の投稿では、少なくとも小さなトランザクションワークロードでは、オーバーヘッドが2%まで低くなる可能性があることが示されています。彼らが指摘したように、これは auto_explain.sample_rate
で減らすことができます クエリのサブセットのみを追跡するという犠牲を払って、パラメータ。
もう少し詳しく説明する最後のパラメータは、 auto_explain.log_format
です。 。デフォルトの出力はTEXTです。これは、 EXPLAIN
を使用することで最もよく知っているものと思われます。 。
これは、TEXT形式のauto_explain出力がどのように見えるかの簡単な例です。
2021-09-10 15:32:04.606 BST [22770] LOG: duration: 3184.383 ms plan: Query Text: select * from table1 order by column1; Sort (cost=12875.92..13125.92 rows=100000 width=37) (actual time=2703.799..3055.401 rows=100000 loops=1) Sort Key: column1 Sort Method: external merge Disk: 4696kB Buffers: shared hit=837, temp read=587 written=589 -> Seq Scan on table (cost=0.00..1834.01 rows=100000 width=37) (actual time=0.033..27.795 rows=100000 loops=1) Buffers: shared hit=834>
ここで、クエリプランの最初にクエリ期間が取得されていることがわかります。これは、通常、クエリプランの最後に表示されることに慣れている可能性があります。パラメータを含むクエリテキストも表示されます。
人気のある視覚化ツールexplain.depeszとexplain.daliboは、どちらもTEXT形式のクエリプランを受け入れますが、どちらもJSON形式をサポートしています。チームの一部が、JSON形式のみをサポートするPEVやpgMustardなどのツールを使用することを好む場合は、それを形式として設定することをお勧めします。 ScaleGridのお客様には、JSON形式を選択しました。これは、独自の低速クエリ分析機能のために、JSON形式をより簡単に解析したかったためです。
auto_explainパラメータとそのデフォルトの完全なリストは次のとおりです:
パラメータ | PostgreSQLのデフォルト | ScaleGridのデフォルト |
---|---|---|
auto_explain.log_min_duration | -1 | 100 |
auto_explain.log_analyze | オフ | オン |
auto_explain.log_timing | オン(log_analyzeを使用) | オン |
auto_explain.log_buffers | オフ | オン |
auto_explain.log_verbose | オフ | オン |
auto_explain.log_triggers | オフ | オフ |
auto_explain.log_nested_statements | オフ | オフ |
auto_explain.log_settings(v12) | オフ | オフ |
auto_explain.log_wal(v13) | オフ | オフ |
auto_explain.log_format | テキスト | JSON |
auto_explain.log_level | ログ | ログ |
auto_explain.sample_rate | 1 | 1 |
auto_explainのインストール
ScaleGridでは、auto_explainはデフォルトでオンになっており、しきい値は100ミリ秒です。これは、[管理]->[構成]で構成できます。
バニラPostgreSQLでは、auto_explainを session_preload_libraries
の1つに追加するだけでインストールできます。 またはshared_preload_libraries
。前者には、a)再起動が不要(ただし、新しいセッションでのみロードされる)、b)一部のユーザーのみが有効にできる( ALTER ROLE SET <でこのパラメーターを設定する)という利点があります。 / code> 。
そのため、auto_explainの基本的な構成設定は次のようになります。
session_preload_libraries = auto_explain auto_explain.log_min_duration = 100 auto_explain.log_analyze = true auto_explain.log_buffers = true auto_explain.log_format = JSON
別のホスティングプロバイダーを使用している場合は、それらがauto_explainをサポートしているかどうかを確認する価値があります。たとえば、RDS Postgresは機能しますが、ScaleGridとは異なり、デフォルトでオフになっているため、構成を編集して実行する必要があります。
auto_explainを単一のセッションにロードする
auto_explainをセッションで自動的に実行したくない場合は、スーパーユーザーとして、単一のセッションにロードすることもできます。
LOAD 'auto_explain';
これは、1回限りのデバッグセッションには非常に便利ですが、すでに実行できる場合は当然不要です。
auto_explainの制限と落とし穴
これらのいくつかについてはすでに説明しましたが、auto_explainのいくつかの欠点と制限を思い出すのは賢明な時期のようです。
まず、特に操作ごとのタイミングを追跡する場合、auto_explainを使用することで測定可能なオーバーヘッドが発生する可能性があります。タイミングを測定しても低くなる可能性がありますが、これまでどおり、独自のテストを行う価値があります。
次に、auto_explainのタイミングにはクエリプランニング時間が含まれていません。遅いクエリでは計画時間が短いことがよくありますが、例外的なケースでは、問題の大部分の原因となる可能性があります。そのため、これらのケースがログに表示されない場合があることに注意してください。表示される場合は、合計レイテンシで表示される内容との不一致は、計画時間に関係している可能性があります。手動のEXPLAINANALYZE
すぐにこれを見つけるのに役立ちます。
explain出力を使用してクエリを高速化する方法
最も遅いクエリのexplain出力を取得したら、それらの高速化を検討し始めることができます!
ログからクエリプランを取得する必要があります。これを行うマネージドサービスを使用していない場合は、pgBadgerを使用できます。
EXPLAIN計画のレビューは、それ自体が大きなトピックです。 PostgreSQLのドキュメントには、EXPLAINの使用に関する優れた簡単な紹介が含まれています。また、EXPLAINANALYZEの読み方に関するThoughbotの記事は次のステップとして適しています。 1時間の話をしたいのなら、JoshBerkusによるEXPLAINの説明は素晴らしかったです。詳細については、DepeszにはExplaining the unexplainableと呼ばれる一連の投稿があり、pgMustardチームにはかなり包括的なEXPLAINGlossaryがあります。
データベースを管理し、低速のクエリを高速化するためにPostgreSQLの専門家の支援が必要な場合は、ScaleGridを試してみてください。 24時間年中無休の無料のエンタープライズレベルのサポートを提供しており、これらの遅いクエリをガイドし、すべてを最適化するのに役立ちます。 30日間の無料トライアルでは、PostgreSQLやその他のサポートされているデータベースの多くの機能を試すことができます。
これにより、auto_explainの使用を開始し、低速のクエリを高速化するために必要なすべてが提供されることを願っています。他に知りたいことがあれば、連絡してください。