【くえりさいてきか】

クエリ最適化 とは?

最終更新:
💡 欲しい結果はそのままに、SQLの仕事を減らす

データベースの問い合わせを、必要な結果を保ちながら効率よく実行すること。実行計画や統計情報を調べ、索引・問い合わせの書き方などを検討し、変更前後を比較します。

📌 このページのポイント
同じ結果を、効率よく取り出す例:注文番号42を探す表を順に調べる索引から探す41 42 43 44 …42 → 該当する行注文42を取得注文42を取得同じ結果同じ結果索引がいつでも最速、とは限らない実行計画と、変更前後の結果・負担を比較
検索方法の候補を比べた例。データ量や条件によって選ぶ計画は変わり、全行を読む方法が適する場合もあります。
ひよこ ひよこ
SQLが遅いときは、索引を足せばいい?
ペンギン先生 ペンギン先生
まずどの問い合わせで困っているかを測り、EXPLAINで実行計画を見よう。行をどれくらい読み、どう結合しているかを調べるんだ。全行を読む方法が悪いとは限らず、少ない表や多くの行が必要な検索では合理的なこともあるよ。
ひよこ ひよこ
データベースも選んでくれるんだよね?
ペンギン先生 ペンギン先生
うん。プランナーは索引や結合順などを選ぶため、行数や値の分布といった統計を使う。例えばPostgreSQLではANALYZEで統計を更新できるよ。推定と実際の行数が大きくずれていないかも、手がかりになるんだ。
ひよこ ひよこ
EXPLAINなら、実行しないで調べられる?
ペンギン先生 ペンギン先生
通常のEXPLAINは計画を表示する。一方、PostgreSQLのEXPLAIN ANALYZEは実際に問い合わせを実行して計測するよ。更新や削除も実行されるため、検証環境や副作用を確認して使おう。画面に結果の行が出ないから安全、とは限らないんだ。
ひよこ ひよこ
書き換えれば、必ず速くなる?
ペンギン先生 ペンギン先生
索引や取得する列、結合の仕方を検討できるけど、万能な書き換えはない。重複行やNULLなどの扱いを変えず、同じ条件で結果と時間を比べよう。索引にも更新時の処理や容量の負担があるので、ほかの問い合わせも含めて効果を確認するんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「クエリ最適化」って出てきたら「欲しい結果を保ちながらSQLの実行を効率よくすること」と思えばだいたいOK!
📖 おまけ:英語の意味
「Query Optimization」 = 問い合わせの最適化
💬 データベースが実行方法を選ぶ処理と、人が問い合わせや索引などを調整する作業の両方で使われます。「必ず最速の方法が得られる」という保証ではありません。

参考資料

← 用語集にもどる