✈️

クエリプラン見やすいの作ってみた

2024/09/16に公開

作ったもの

クエリプラン(以下QueryPlan)は有用な情報だけど、情報量が多いため有効利用が難しく、しているとは言えていない現状・・・有効利用できていない理由の一つは、現行のSSMSでの画面だと、詳細な数値、情報の参照が困難な印象あり。

それを解決するためのツール作成した次第。

QueryPlanShare

目的

SQLServerのクライアントツール(以下SSMS)でクエリ実行時に提供されるQueryPlanは実際にクエリが期待通りのプランを用いて実行されているか、実行しよとしているかの判断や、実行結果の遅延がどこに依存するのかを把握するのに有効利用可能だと思います。SSMSでチャート化してみる分には期待し情報得ることは可能だと思います。

ただし、複数のQueryPlanを比較したり、詳細な数字を比較するのには見ていく上で面倒で、毎回XmlをRaw状態で確認するのは手間がかかる。 簡単にQueryPlanを詳細に確認できたり、コストかかっている場所数値で確認できたりするツールないかなという思いで作成したツールです。

手順

  1. 確認したいクエリを準備
select  * from sys.objects where type ='U'
  1. SSMSでQueryPlanを入手

    1. 推定QueryPlanの入手

      1. SSMSでの実行

        SET SHOWPLAN_XML ON;
        GO
        select  * from sys.objects where type ='U';
        GO
        SET SHOWPLAN_XML OFF;
        GO
        
      2. 実行結果

      3. コピー

        右クリックからのコピー可能

        あるいは、ダブルクリックで、SSMS上でのChart確認可能

    2. 実行QueryPlanの入手

      1. SSMSでの実行

        SET STATISTICS XML ON;
        GO
        -- クエリを実行
        select  * from sys.objects where type ='U';
        GO
        SET STATISTICS XML OFF;
        GO
        
      2. 実行結果

      3. コピー

        <ShowPlanXML・・>から始まる部分が目的のQueryPlanです。

        右クリックからのコピー可能

        あるいは、ダブルクリックで、SSMS上でのChart確認可能

  2. このページで登録

    1. URL

      https://queryplansharev4.vercel.app/QueryPlanShare/input

    2. 画面

    3. QueryPlan入力

    4. 登録

      「Regist」ボタンで登録

  3. 可視化された、QueryPlanを確認

    • plan

  4. URLを必要に応じて保存、共有

主な項目

Url,Xml,Queryなどクリックすることで内容確認可能です。

URL

このページを表示するためのURLです。識者に確認をお願いするときなどは利用可能。

URLの右のアイコンでクリップボードへコピー可能

一度登録したURLは再現できないので、再度表示する場合はローカルへのメモなどが必要です。

Plan

チャート形式での表示、QueryPlanの中で期待通りプラン実行されているか、各処理でかかるコスト、適切にIndexSeekがされているかなど確認可能。

カーソルオーバーすることで、各処理のコストの詳細確認可能

Detail


クエリ全体に対するコストなどの表示。

Subinfo

SSMSでのチャート表示だと、表示されない(と思われる)Xmlないに含まれている詳細の表示です。

「OptimizerStatsUsage」:オプティマイザーが利用した統計情報、統計情報の更新日付

「MemroyGrantInfo」:クエリでのメモリ利用量

など、詳細な情報の提示

RelOp

QueryPlanでの各処理の詳細。どの処理でコストかかっているかの確認、かかっている原因などの調査が可能です。「EstIO」,「EstCPU」などは各処理がどの程度、Disk利用しているか、CPU処理しているかの判断で有効。「SeekPredicates」は、「IndexSeek」で利用している条件句の確認、

注意点

  • QueryPlanはある程度大きいものを想定しています。古い(1か月想定)QueryPlanは自動での削除を予定しています。
    • 原文のQueryPlanは各々が個別に保存しておくこと推奨です。
  • アップロードされたQueryPlanはURL指定すれば、だれでも参照可能なので、自己責任でアップロード対象のQueryPlanを入力してください。
    • クエリ自体に個人情報など含まれている場合もあるので注意

その他

開発環境

  • Visual Studio Code
  • Next.js
  • ShadCN/UI
    • UI周りの調整にたいしては有用~
  • PrismJS
    • NextJSとの組み合わせ、ちょっと手順必要だったけど、ドキュメント通りで可能
  • html-query-pan
    • これと、NextJS組み合わせで手間取った印象あり。
    • JS自体有用なライブラリ多数あるので、今後とも対応必要な技術のイメージ

デプロイ

今後

  • ログイン機能作成して、ログイン者毎に登録したQueryPlanを一覧確認できて、利用できるようにする?
    • その場合保存期間1か月も見直すことは可能かと(検討中・・・)
  • もっと有用なQueryPlanの情報などあれば、指摘もらえれば、UI追加などはしたいと思っています。

経緯

日付 内容
2024/08/25 実装開始
2024/09/06 Deploy
2024/09/16 Zenn記事アップ

Discussion