こんにちは!データベースの世界へようこそ。
普段、PostgreSQLと向き合っていると「どうすればもっとクエリが速くなるかな?」と悩むこと、ありますよね。実は、私たちが書いたSQLがデータベースの中でどう処理されているのかを知ると、そのヒントが見えてくるんです。
今日は、そんな最適化の第一歩として「定数畳み込み(Constant Folding)」という、ちょっと賢い仕組みについてお話ししようと思います。
—
宿題を「計算してから」渡してくれる、賢い助手
突然ですが、こんな状況を想像してみてください。
あなたは上司から「今月は30日間あるから、その30日間に1日あたり8時間働いた場合の『総労働時間』を計算して報告してくれ」と頼まれました。
あなたならどうしますか?
わざわざ「30 × 8」と電卓を叩いてから「240時間です」と報告しますよね。わざわざ「30 × 8」という数式をそのまま上司に渡す人はいないはずです。
実は、PostgreSQLもこれと全く同じことをやっているんです。
「定数畳み込み」ってなに?
PostgreSQLは、私たちが投げたSQLを受け取ると、実行する前に一度じっくりと「中身」を眺めます。この工程を「クエリ最適化」と呼ぶのですが、その中で「あ、これ計算の結果は最初から決まってるな」と気づく瞬間があるんです。
例えば、こんなSQLを書いたとしましょう。
SELECT FROM orders WHERE price > 100 24;
人間が見ると「あ、100 × 24 は 2400 だな」と一瞬でわかりますよね。
PostgreSQLも同じです。「わざわざデータベースを検索するたびに、毎回 100 × 24 を計算してたら無駄だよね? 先に計算しちゃおう!」と判断します。
そして、データベースの中ではこっそり次のように書き換えてから実行しているんです。
SELECT FROM orders WHERE price > 2400;
この、「式をあらかじめ計算して、結果に置き換えてしまうこと」。これが「定数畳み込み」です。
なぜこれが「最適化」なの?
「たかだか掛け算ひとつでしょ? そんなに変わるの?」と思うかもしれません。でも、これが何百万行ものデータを相手にする世界だと話が変わってきます。
- 無駄なCPU消費を抑える: 何万回、何億回と繰り返される処理の中で、毎回同じ計算をしていたら、それだけでCPUはヘトヘトになってしまいますよね。
- プランナ(実行計画を作る頭脳)を助ける: 計算結果が確定していれば、データベースは「お、じゃあこの範囲のデータを探せばいいんだな」と、検索の計画をより正確に、効率よく立てることができるんです。
私たちが気をつけるべきこと
この「定数畳み込み」、とっても便利で賢い機能なのですが、一つだけ注意点があります。
それは「データベースが計算できる形にしてあげること」です。
例えば、関数の結果や、その時その時の時刻(`NOW()`など)が含まれると、データベースは「これは実行してみないと何になるか分からないや……」と諦めて、計算を後回しにしてしまうことがあります。
ですので、定数だけで書ける計算は、できるだけ人間側で整理してあげると、PostgreSQLはより一層軽快に動いてくれるんですよ。
—
まとめ:データベースと仲良くなろう
「定数畳み込み」は、データベースが私たちに代わって「面倒な計算は先に片付けておくね!」と言ってくれているような、心強い機能です。
もちろん、私たちが意識しなくてもPostgreSQLは優秀に動いてくれますが、「あ、今この式は畳み込まれているな」と想像しながらSQLを書くようになると、なんだかデータベースとの距離が少し縮まった気がしませんか?
これからも、こうやってデータベースの「中の人の気持ち」を少しずつ紐解いていきましょうね。
もし分からないことや、「ここはどうなってるの?」という疑問があれば、いつでもコメントで教えてください。また次回の記事でお会いしましょう!
コメント