こんばんは、イオンネクストで主にデータ基盤やBIツール等の担当をしています神戸です。
データ環境を手軽に使えるようになって、エンジニアではないユーザ層も自分でデータ分析を行って業務に生かすことが日常の風景になってきました。
様々なSQLが作られると、関数が正しく使われていない等のクエリが実行されてデータベースの負荷が上がる等、データや基盤を保守する担当者の頭を悩ませる問題が出て来ます。
今回は、クエリ実行が終わらない、データベースの負荷が上がる原因になるスロークエリへの対処を、生成AIを使って原因を分析して対処する方法を紹介します。
この記事では、Azure SQL等マイクロソフト製のデータベースをデータ分析基盤として使っているケースを扱いますが、MySQLのexplain等、実行計画を取得できる環境であれば参考に出来ると思います。
1.SQL Server Management Studioを起動して、実行計画を表示できる権限を実行アカウントに設定します。
2.分析したいクエリを記述し、赤枠をクリックすると実行計画の結果が画面下段に表示されます。
3.実行結果は、Clustered Index Scanの結果が99%になっていて、ここに問題がありそうだと推定できます。
4.実行結果を生成AIで分析するために、実行結果をXMLで取得します。実行結果を右クリックして表示されるメニューから、"Show Execution Plan XML"をクリックすると実行結果がXMLで表示されます。
5.表示されたXMLをすべてコピーし、テキストに保存します。
6.生成AIのサービス(ここではCopilot)を開いて、保存したテキストを添付し、図のようなプロンプトを書いてみます。役割を明示し、行って欲しいことを明確にして下さい。狙い通りの結果にならない場合は、クエリスコアを出してほしい、インデックスを補完するクエリを作成して欲しい等、要件を少しずつ掘り下げていきます。
7.プロンプトの内容により、図のような結果が表示されます。クエリコストが4237.65で、統計情報とクエリ自体には問題なく、クエリコストの大半をインデックスの問題が占めていると分かるので、生成AIの指示に従ってデータベースにインデックスの追加を行います。インデックスの追加を行う前に、生成されたクエリが正しいことを検証します。
8.SQL Server Management Studioを起動して、生成されたクエリを実行します。下記のような結果が返ったら問題なく実行されています。
Commands completed successfully.
Completion time: 2024-12-04T17:45:45.5892748+09:00
9.2の手順を行って、インデックス追加後の実行結果を表示させます。実行結果を見ると、Index Seek(NonClustered)と表示され、効果的にインデックスを使用されたことがわかります。通常実行で30分でも処理が終わらないクエリの実行が数秒で終わり明確に効果を体感できます。
10。4~6の手順を実行し、9の結果をテキスト保存したXMLを生成AIに分析させてみます。結果を見るとクエリコストが4237.65から0.00336に激減し、クエリパフォーマンスを改善したことがわかります。
今回はインデックスの追加を行いましたが、同じ手法で、結合条件や関数の使い方、フィルタ条件で性能の問題が出ている箇所を見つけることが出来、クエリの修正でもスロークエリの改善を行うことが出来ます。
今回はスロークエリの原因を見つけるための実行計画の解析を生成AIに代行させて、スロークエリを素早く楽に改善する方法を紹介しました。