🐘

RDBMS の SQL クエリは実行前に最適化されるのか?

2024/01/26に公開

疑問

データベースはまったく門外漢なんだけど SQL 書こうと思うと計算量が気になって仕方がない。ぶっちゃけそんな計算量が気になる程大量のデータを取り扱う場面はいまのところそんなに遭遇してないのでよいのだが気になるもんは気になる。

たとえば

SELECT name, email FROM meibo JOIN email ON meibo.id = email.id;

SELECT name, email FROM meibo, email WHERE meibo.id = email.id;

だと直感的に下のほうが計算量小さそうじゃないか[1]、とかスッゲェ気になる。

でもさぁ、頭のいい人たちがその程度のこと考えないわけがないよなぁ!?

実行前に! オプティマイズ! されてるんじゃないですか!?

ChatGPT に聞いてみた

裏取り

https://www.postgresql.org/docs/current/planner-optimizer.html

調査結果

限度はあると思うが、実行前に最適化されてるらしいのであんま細かいことは気にしなくてよさそう。

これで安心して SQL が書ける。ありがとう ChatGPT。我が友よ。

追記

かちゃかちゃ(@haruo31)さんが「explain と前に書くと実行計画を教えてくれる」との情報をくださいました。

https://www.postgresql.org/docs/current/using-explain.html

ほんまや! ありがとうございます!!

脚注
  1. SQL が書いた通りに実行されるならば JOIN のほうはあとで抽出する予定がないすべてのカラムまで結合した新しいテーブルを作成し、そこから nameemail という列だけを取得するというめちゃくちゃ無駄な処理をすることになる。結合前のテーブルがデカい場合、空間計算量が非常に大きくなるはず。 ↩︎

Discussion