SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server のクエリオプティマイザについての理解を深めるための技術情報

leave a comment

以前、SQL Server のクエリオプティマイザを学習する際に確認するドキュメント という投稿を書きました。

SQL Server のクエリオプティマイザを学習するためには、上記の投稿で触れている技術情報に加えて、SQL Server ディスク ベース テーブルに対するクエリ処理 の以下の図を意識する必要があります。

SQL Server のクエリ実行時の実行プランの生成については、

  1. Parser による構文解析
  2. Algebrizer によるオブジェクトのバインドと論理操作の出力
  3. クエリオプティマイザによる物理操作の選択
  4. クエリ実行

というような流れとなります。

「2.」の Algebrizer が論理操作 (論理ツリー) を出力する部分については、公開されている情報が少ないのですが、「3.」のクエリオプティマイザの動作については、様々な情報が公開されています。

本投稿ではどのような情報が公開されているのかについてまとめておきたいと思います。

クエリオプティマイザの動作の把握

  • Algebrizer によって生成される論理操作の論理ツリー
  • 論理操作をどのようにして、実際に実行するかの物理操作を選択した物理ツリー作成されるか

が、クエリオプティマイザについての理解を深めるために重要な情報となります。

クエリオプティマイザが最終的な実行プランを生成する際には、メモと呼ばれる構造体 (Memo Structure) に情報を格納してプランの作成が行われますが、この際の一連の流れについては、次のような情報を基にすると理解を深めることができます。

 

トレースフラグによる挙動の制御

実行プランのコンパイル時の各種操作の制御や、メモの情報の出力については、トレースフラグで制御を行うことができ、上記の情報にも記載されています。

SQL Server Trace Flags – Complete list に記載されている次のようなトレースラグで情報の取得を行うことができます。

Algebrizer が論理ツリーを作成する処理についても確認ができるとよいのですが、そのための方法が提供されているのかはわかりませんでした。

クエリコンパイルの制御

  • Trace Flag: 8671
    • Undocumented trace flag
      Function: According to Dima, disables the logic that prunes the memo and prevents the optimization process from stopping due to “Good Enough Plan found”. Can significantly increase the amount of time, CPU, and memory used in the compilation proces

  • Trace Flag: 8780
    • Function: Give the optimizer more time to find a better plan
  • Trace Flag: 8757
    • Function: Skip trivial plan optimization and force a full optimization

Memo Structure の情報の出力

  • Trace Flag: 8608
    • Function: Shows the initial Memo structure
  • Trace Flag: 8615
    • Undocumented trace flag
      Function: Display the final memo structure
  • Trace Flag: 8675
    • Function: Displays the query optimization phases for a specific optimization
  • Trace Flag: 8675
    • Function: Displays the query optimization phases for a specific optimizatio

 

 

Memo Structure の情報の解析は、とても奥が深いのですが、英語であれば様々な情報があり、Algebrizer によって生成された論理ツリーがオプティマイザによってどのように最適化されるのかを理解するのに役に立ちます。

queryprocessor.ru では、記事の内容を試すためのサンプルテーブルについても公開が行われていますので、実際に手を動かしながら、興味のあった箇所をさらに調べることで、クエリオプティマイザの理解を深めることができるのではないでしょうか。

Share

Written by Masayuki.Ozawa

1月 27th, 2022 at 10:57 pm

Posted in SQL Server

Tagged with

Leave a Reply