「象」を1つずつ分析する

あなたが定期的にデバッグする場合は、PostgreSQLのクエリのパフォーマンスを、そしてEXPLAIN (ANALYZE, BUFFERS) ...このDBMSの特殊性についての学習のためのお気に入りのツールです、そして、私たちの新しい有用な「チップ」の可視化と分析のためのサービスプランは、explain.tensor.ruは確かに、この困難な作業であなたに有用であろう。



しかし、PostgreSQLデータベースの本格的な包括的な監視がなければ、計画分析のみを使用することは賢人#5の立場から行動していることをすぐに思い出させてください





[ソースKDPV「盲人と象」 ]



, 1940





, ,



.

,

,

, .







, —

.



,

:



!



,

,

, ,

.



,

,

,

.



盲人の間で争いが起こり

、一年続いた。

それから盲人はついに

手を動かした。



そして、5番目が強かったので、

-彼はみんなの口を閉じました。

そして今後、象は

片方の尾で構成されます!


それで、今日のプログラムでは:



  • 「シェブロン」を「ショルダーストラップ」に変更
  • 「メガ」プランをまとめる
  • 私たちは個人的なアーカイブを保持します
  • 計画の系譜を研究する
  • 「窓」をのぞき込む


単色ではありません!



歴史的に、計画を表示するとき、値の左側にある垂直の「シェブロン」で「最もホットな」ノードをマークしました。値が高いほど、色が濃くなります。







しかし、そのようなモデルでは、値の比率はほとんど認識されていません-たとえば、色合いの違いの30%の偏差は、訓練された目でのみ気付くことができます。そのため、水平方向の「ショルダーストラップ」からヒストグラムを作成しました







「メガ」プランの有用な統計



多くの人は計画の「統計」タブに気づいていません。ここでは右側





にあります。気付いた人は誰でも、ほとんど積極的に使用していません。この欠落を修正し、「大規模な」計画(100以上のノード)の分析に非常に役立つようにすることにしました



ノードのグループ化



すべての「同一の」プランノード(つまり、同じノードタイプ、使用されるテーブル、およびインデックスを持つノード)は、1つのテーブル行にグループ化されます。この場合、それらのすべてのインジケーター(実行時間、読み取られたレコードと破棄されたレコードの数、パスの総数、および読み取られたデータの量)が合計されます。



また、わかりやすくするために、各ノードタイプにはカラーラベルが付いています。



  • -データの読み出し

    ノードをSeq ScanIndex ScanCTE Scanおよび他の様々な... Scan
  • 黄色-データ処理

    ノードSortUniqueAggregateGroupMaterialize、...
  • -接続

    ノードNested LoopMerge JoinHash Join、...




任意のインジケーターによる並べ替え



突然、合計時間ではなくノードのタイプごとに分析が必要になった場合、たとえば、列見出しをクリックするだけで、すべてが次のようになります。







コンテキストノードのヒント



グループ内の特定のノードの寄与を詳細に理解するには、それらのいずれかの数にカーソルを合わせます。ここで正確に何が起こったかについての従来のヒントが表示されます。







計画の個人アーカイブ

「登録もSMSもなし!」



当社のサービスを積極的に利用している場合は、以前に分析した計画を見つけるのがはるかに簡単になりますアーカイブの[マイニング]タブ切り替えるだけです計画は、一般アーカイブでの公開に関係なくここに分類され、あなただけが見ることができます。





計画の系譜



以前は、アーカイブで特定のプランを見つけるのは非常に困難でしたが、今では簡単です。それらに名前を付けて、最適化の「ファミリーツリー」にグループ化することができます



プランを追加するときに名前を指定するだけ







です...または既存のプランで、リンクされたプランを設定、編集、または追加







できます次に、オプションのツリー全体をすばやく切り替えて、特定の最適化の効果を評価できます:







特定のプランへのリンクが突然発生した場合失われた彼は、個人のアーカイブにある彼の名前で簡単に識別できます。





「窓」をのぞき込む



以前書いたQueryProfilerの 小さいながらも便利な拡張機能です。「ウィンドウを調べて」、プランノードに正しくマップするように教えました。



->  WindowAgg   ==>  WINDOW / OVER
      ->  Sort  ==>    PARTITION BY / ORDER BY


... WINDOW1つのリクエスト内の「ウィンドウ」()のいくつかの独立した定義として







...明示的な定義なしでウィンドウ関数を並べ替える:







さまざまな非効率性を探してください!



All Articles