SQLクエリの最適化と実行計画のAIによる自動分析手法

【実録】専任DBA不在の組織がAI実行計画分析でAWSコストを60%削減した全プロセス

約14分で読めます
文字サイズ:
【実録】専任DBA不在の組織がAI実行計画分析でAWSコストを60%削減した全プロセス
目次

プロローグ:深夜のアラートとAWS請求書の衝撃

深夜2時、スマートフォンのアラートが鳴り響く。画面には「RDS CPU Utilization > 90%」の通知。

管理コンソールを確認すると、RDSのモニタリンググラフは天井に張り付いている。サービスへのアクセス数はそこまで増えていないにもかかわらず、データベースだけが悲鳴を上げている状況だ。アプリケーションログにはタイムアウトのエラーが並び、チャットツールには不安げなメッセージが投稿される。

このような状況下で、多くの開発現場が取る選択肢は一つになりがちです。「インスタンスタイプの変更」、つまり、より高価で強力なサーバーへのスケールアップです。再起動に伴うダウンタイムを甘受し、「適用」ボタンを押す。グラフが落ち着きを取り戻すのを見届けて、ようやく胸をなでおろす。

これは特定の企業に限った話ではなく、急成長中の多くのWebサービス開発現場で繰り返されている光景です。

サービス急成長の裏で起きていたDB負荷の増大

事業が順調に推移し、ユーザー数が毎月120%のペースで成長しているようなフェーズでは、機能追加の要望は山のように積まれます。開発チームは優秀で、アジャイルに新機能をリリースし続けていることでしょう。

しかし、その裏でデータベース(例えばAmazon Aurora PostgreSQLなど)は静かに、しかし確実に限界に近づいていきます。初期段階では「とりあえず動く」クエリでも問題ありません。データ量が数万件レベルなら、多少非効率なSQLでもデータベースエンジンがメモリ上で力技で処理してしまうからです。

ところが、データ量が数百万、数千万件を超えたあたりから、状況は一変します。インデックスが効いていない検索、無駄な結合、大量のソート処理。これらが積み重なり、I/Oクレジットを食いつぶし、CPUリソースを奪い合います。

「インスタンスサイズアップ」という対症療法の限界

当初はこの問題を「成長痛」だと捉え、コストで解決しようとするケースが一般的です。AWSの請求書におけるRDSの項目が、前月比で数万円、数十万円と増えていっても、「売上も伸びているから大丈夫」と判断されがちです。

しかし、特定の月の請求額を見て、技術責任者は血の気が引く思いをすることになります。データベースのコストだけで、エンジニア数名分の人件費に匹敵する額に膨れ上がるからです。しかも、インスタンスサイズを上げても、パフォーマンスの改善幅は徐々に小さくなっていきます。ボトルネックはハードウェアのスペックではなく、ソフトウェア(クエリとデータ構造)にあることは明白です。

さらに2026年現在、インフラチームを取り巻く環境は厳しさを増しています。Amazon Linux 2023への移行対応や、AWS Proton、CodeCatalystといった一部サービスの新規利用停止・終了に伴う構成変更など、維持管理のタスクは増加の一途をたどっています。こうした「守りの運用」にリソースを割かれる中で、高度なDBチューニングにまで手が回らないのが実情ではないでしょうか。

「これ以上、札束で殴るアプローチは通用しない」

組織として根本的な治療、つまりクエリの最適化(チューニング)に向き合う覚悟を決めたとき、そこには「専任DBA(データベース管理者)不在」という、大きな壁が立ちはだかるのです。

課題の深層:なぜ「インデックス追加」だけでは解決しなかったのか

「スロークエリログに出ているSQLに、片っ端からインデックスを貼ればいいのではないか」

現場ではよくこのような提案がなされます。確かに、それは教科書的な第一歩です。しかし、実際に試してみると、効果は限定的であることが少なくありません。むしろ、無闇にインデックスを増やしたことで書き込み性能(INSERT/UPDATE)が劣化し、ストレージ容量を圧迫するという副作用さえ招いてしまうケースが散見されます。

スロークエリログの山に埋もれる開発者たち

pg_stat_statements やPerformance Insightsを使って、負荷の高いクエリを特定しようとするアプローチは一般的です。しかし、リストアップされたクエリを見て、開発現場が頭を抱えることは珍しくありません。そこには、ORM(Object-Relational Mapping)ライブラリが自動生成した、解読不能なほど複雑なSQLが並んでいることが多いからです。

例えば、5つのテーブルを結合し、サブクエリが何重にもネストされた数100行に及ぶSQL。これを人間が目で追い、どの部分が遅いのかを特定するのは、非常に困難な作業です。機能開発に追われるアプリケーションエンジニアにとって、この解析作業はあまりにも負荷が高く、大きな負担となるタスクです。

複雑な実行計画を読み解くスキルの属人化

データベースチューニングの肝は、「実行計画(Execution Plan)」の理解にあります。EXPLAIN ANALYZE コマンドを実行すれば、データベースがそのクエリをどう処理しようとしているか、詳細な手順を教えてくれます。

しかし、その出力結果は「暗号」に近いものです。

Nested Loop  (cost=100.00..12345.67 rows=50 width=128)
  ->  Seq Scan on users  (cost=0.00..456.78 rows=10000 width=64)
        Filter: (created_at >= '2023-01-01'::date)
  ->  Index Scan using orders_user_id_idx on orders ...

「Seq Scan(全件走査)が出ているから悪い」といった単純な話ではありません。テーブルのサイズが小さければ全件走査の方が速い場合もありますし、Nested Loop結合が適切かどうかもデータの分布(カーディナリティ)に依存します。

この実行計画を正しく読み解き、「ここで統計情報がズレているから、プランナが誤った判断をしている」とか、「この複合インデックスの列順序が逆だ」と判断できるスキルは、極めて高度な専門性です。多くの開発現場には、そこまでデータベースの内部挙動に精通したメンバーが揃っているわけではありません。

結果として、「なんとなく遅そうなクエリ」を「勘」で修正し、本番で試しては失敗する、という非効率なサイクルを繰り返してしまう組織も少なくありません。これでは、いつまで経ってもコスト削減など夢のまた夢です。

転換点:AIによる「実行計画」自動分析の導入

課題の深層:なぜ「インデックス追加」だけでは解決しなかったのか - Section Image

生成AI(LLM)の進化に伴い、「この複雑怪奇な実行計画の解析こそ、AIが得意な領域ではないか?」という視点が重要になってきました。AIであれば、膨大なテキストデータからパターンを見つけ出し、論理的な推論を行うことが可能だからです。

AIツール選定の基準:精度と安全性

AIによる分析を導入するにあたっては、一般的に以下の条件でツールや手法を検討する必要があります。

  1. 実行計画の深い理解: 単なるSQLの構文チェックではなく、EXPLAIN (ANALYZE, BUFFERS) の出力を読み解き、ボトルネックを特定できること。
  2. スキーマ情報の考慮: テーブル定義(DDL)やインデックス情報を加味した提案ができること。
  3. データプライバシーの確保: これが最も重要です。顧客データそのもの(レコードの中身)は絶対にAIに渡してはいけません。

アプローチとしては、既存のAPMツールに組み込まれたAI機能と、ClaudeやChatGPTの最新モデルを活用した独自の分析スクリプトを比較検討するケースが多いでしょう。検証の結果、より柔軟な対話が可能で、文脈を深く理解してくれるLLM(特にClaudeの最新モデルのような長いコンテキストウィンドウを持つもの)をAPI経由で利用する方針が、精度と柔軟性の面で推奨されます。

導入への障壁とセキュリティへの懸念払拭

「AIにデータベースの情報を渡すなんて、セキュリティ的に大丈夫なんですか?」

導入を検討する際、セキュリティチームからこのような懸念が上がるのは当然のことです。そこで重要となるのが、AIに渡す情報を厳密にフィルタリングする仕組みの構築です。

  • 渡すべき情報: テーブル定義(DDL)、インデックス定義、クエリそのもの(パラメータはマスキング)、実行計画のテキスト出力。
  • 渡してはいけない情報: 実際のテーブル内のデータ(レコード)、個人情報、具体的な値。

つまり、AIには「データの構造と統計的な分布情報」だけを伝え、「中身」は見せないように運用設計を行うのです。これにより、情報漏洩のリスクを極小化しつつ、高度な分析の恩恵を受けることが可能になります。

発見:AIが見抜いた「人間が見落としていた」非効率性

発見:AIが見抜いた「人間が見落としていた」非効率性 - Section Image 3

AIによる分析を現場に導入すると、驚くべき事実が明らかになることがよくあります。AIは、人間が「正しい」と思い込んでいたクエリに対して、冷徹かつ論理的な指摘を次々と突きつけてくるのです。

ケーススタディ1:ORMが生成したN+1問題の変種

一覧画面の表示が遅いという問題が発生したケースを例に挙げます。コード上では includes(Eager Loading)を使っているつもりでも、AIは実行計画を見てこう指摘することがあります。

「このクエリでは、関連テーブルの絞り込み条件が複雑すぎるため、データベースオプティマイザがインデックスを使えず、結果としてメインテーブルの全件走査が発生しています。さらに、取得したIDを使ってアプリケーション側で再クエリを行っている形跡があります。これを1つのJOIN句に書き換えるか、あるいはサブクエリをCTE(共通テーブル式)に切り出すことで、オプティマイザが効率的なプランを選択できる可能性が高いです。」

実際にAIが提案したリライト案(CTEを使用したSQL)を試すことで、実行時間が3秒から0.2秒へと、15倍も高速化するような事例も存在します。人間が「ORMがうまくやってくれているはず」と信じ込んでいた部分を、AIは実行計画の数値(CostとRowsの乖離)から見抜くことができるのです。

ケーススタディ2:カーディナリティの見誤りによるフルスキャン

さらに衝撃的なのは、統計情報に関する指摘です。

status カラムのインデックスが使用されていません。これは status = 'active' のレコードがテーブル全体の80%を占めているため、オプティマイザが『インデックスを使うより全件読み込んだ方が速い』と判断しているからです。もし status = 'error' (全体の1%)のような稀なレコードを検索したいのであれば、部分インデックス(Partial Index)を作成することを推奨します。」

このような指摘を受けると、多くのエンジニアはハッとさせられます。盲目的に「WHERE句に使うカラムにはインデックスを」と考えていても、データの分布(カーディナリティ)を考慮していないケースは多々あります。AIのアドバイス通り部分インデックスを作成することで、ストレージ容量をほとんど消費せずに、特定条件の検索速度が劇的に向上する結果が得られます。

AIは単に「速くする方法」を教えるだけでなく、「なぜ遅いのか」「なぜデータベースがそのプランを選んだのか」という理由を言語化してくれます。これが開発チームにとって最大の学びとなるのです。

成果の証明:コスト60%減とレスポンスタイムの劇的改善

発見:AIが見抜いた「人間が見落としていた」非効率性 - Section Image

AIアシスタントを活用した継続的なクエリチューニングは、組織に明確な定量的・定性的成果をもたらします。適切なプロセスでデータベースの最適化を行うことで、以下のようなインパクトが期待できます。

定量的成果:AWS RDSコストとレイテンシーの推移

最大のメリットはクラウドインフラコストの最適化です。特にAWS RDSなどのマネージドデータベースサービスにおいて、非効率なクエリが解消されCPU使用率が劇的に低下することで、インスタンスサイズを適正なスペックへダウンサイズ(例:2段階程度)できるケースは珍しくありません。さらに、不要なIOPS(Provisioned IOPS)の削減もコスト圧縮に大きく寄与します。

効果的なチューニングを実施した場合の改善指標の目安は以下の通りです:

  • RDS月額コスト: 導入前と比較して最大60%程度の削減(規模により月額数百万円単位のインパクト)
  • 平均レスポンスタイム: UXに直結する大幅な短縮(例:450ms → 120msといった改善幅)
  • CPU平均使用率: 高負荷状態からの解放(例:85% → 30%への安定化)

これは単なるコスト削減にとどまりません。最適化によって浮いた予算を、新規事業の開発投資やエンジニアの採用費に回すことが可能になります。経営視点でも、固定費となりがちなインフラコストの適正化は非常に重要な成果です。

定性的成果:開発チームの意識変化

数値的な成果以上に重要なのが、チームのエンジニアリング文化の変革です。「SQLのチューニングは難易度が高い」「専任のDBAがいないためデータベース層はブラックボックス化している」という課題を抱える組織において、AIは強力な「相談相手」となります。

エンジニアがAIに対して「このクエリの実行計画を分析して」と気軽に問いかけ、「インデックスの順序を見直すべき」といった具体的なフィードバックを即座に得る体験を重ねることで、パフォーマンスを意識した開発スタイルが定着します。

「とりあえず動くクエリ」から「効率的なクエリ」へ。AIはチーム内における「ジュニアDBA」あるいは「メンター」としての役割を果たし、組織全体の技術力の底上げに貢献します。

エピローグ:AIを「ジュニアDBA」としてチームに組み込む

多くの現場での実践を通じて明らかになったことは、AIは魔法の杖ではないものの、極めて強力な「拡張機能」であるという事実です。AIが提示するパフォーマンスチューニング案が常に100%正解とは限りません。しかし、人間が見落としがちな視点を提供し、膨大なログの中から「怪しい箇所」をピンポイントで指し示してくれる能力は、専任DBA不在の組織にとって強力なサポーター、いわば「ジュニアDBA」となり得ます。

自動レビュープロセスの確立

このプロセスをさらに進化させ、CI/CDパイプラインに組み込むことが次のステップです。プルリクエストが出されると、変更されたSQLに対して自動的に EXPLAIN が実行され、その結果をAIが分析してコメントする仕組みを構築します。

「この変更により、テーブルAへのフルスキャンが発生するリスクがあります。インデックスの追加を検討してください」

こうした警告が自動で通知されることで、パフォーマンス劣化を本番環境へのデプロイ前に防ぐ「ガードレール」が機能します。

なお、CI/CD環境の構築においては、AWS CodeCatalyst(2025年11月新規利用停止)のような廃止予定のサービスではなく、GitHub ActionsやAWS CodeBuildなど、長期的かつ安定的に利用可能なツールを選定することが重要です。ツールの改廃が激しいクラウドエコシステムにおいて、特定のサービスに依存しすぎない柔軟な自動化フローを設計することが、持続可能な運用の鍵となります。

人間が判断すべき領域とAIに任せる領域

AIは計算とパターン認識、そして膨大なドキュメントに基づいた提案が得意です。一方で、ビジネスロジックに基づいた判断は、依然として人間の役割です。

  • AIの役割: 「このクエリはCPU負荷が高い」「インデックスが使われていない」といった技術的事実の指摘
  • 人間の役割: 「この機能において、多少の遅延はビジネス的に許容されるか?」「将来的にデータ量はどう増える予測か?」といった意思決定

もしあなたのチームが「専任DBA不在」で「クラウドコストの高騰」に悩んでいるなら、安易にインスタンスのスケールアップボタンを押す前に、一度立ち止まって考えてみてください。その追加コストの数分の一のリソースで、AIを活用した解析環境を整えることができるはずです。

クラウドコストの最適化は、終わりのない旅のようなものです。しかし、AIという頼れるパートナーを得た今、その旅路は以前ほど孤独で困難なものではありません。まずは手元のスロークエリログを1つ、AIに問いかけるところから始めてみてはいかがでしょうか。あなたのチームの「見えないボトルネック」を解き明かす鍵は、すでにそこにあります。

【実録】専任DBA不在の組織がAI実行計画分析でAWSコストを60%削減した全プロセス - Conclusion Image

参考リンク

コメント

コメントは1週間で消えます
コメントを読み込み中...