こんにちは!データベースの世界へようこそ。
普段、PostgreSQLを触っていると「データ量が増えてきて、なんだか検索が遅くなってきたな……」なんて悩むこと、ありますよね。そんなとき、まるで魔法のようにクエリを速くしてくれる機能の一つが、今回紹介する「制約除外(Constraint Exclusion)」です。
カタカナで書くと難しそうですが、仕組みを知れば「なーんだ、すごく賢い工夫なんだね!」と思ってもらえるはず。今日は、この機能についてお話ししますね。
—
膨大な書類から、目的のものを探すには?
想像してみてください。あなたは巨大な図書館の司書さんです。
そこには100年分の「売上日報」が、毎日1冊ずつファイルに綴じられて保管されています。
さて、誰かが「2023年10月の売上データを見せて!」と言ってきたら、あなたはどうしますか?
100年分、つまり36,500冊のファイルを全部めくって探しますか?……そんなことをしたら、日が暮れてしまいますよね。
でも、もし各棚に「2023年用」「2022年用」というラベルが貼ってあったらどうでしょう。あなたは迷わず「2023年」の棚へ直行して、そこにある31冊だけを確認すればいい。これなら、あっという間に見つかりますよね。
データベースにおける「制約除外」は、まさにこの「棚のラベルを見て、無駄な場所を探さない」という賢い立ち回りのことなんです。
—
PostgreSQLはどうやって「サボり」を覚えたのか
PostgreSQLのプランナ(クエリをどう実行するか考える司令塔)は、とても優秀です。
もしテーブルに`CHECK制約`という「このテーブルには2023年のデータしか入っていませんよ!」というメモ(制約)が貼ってあれば、プランナはこう考えます。
「なるほど、ユーザーは2023年のデータを探しているんだな。じゃあ、2022年の棚には絶対に入っていないはずだ。よし、2022年の棚はスルーして、2023年の棚だけを見に行こう!」
これが「制約除外」の正体です。
不要なテーブルやパーティションを、検索の対象から「除外」する。たったこれだけのことですが、データが数千万件、数億件と増えてくると、この「見に行かない」という判断が、とてつもない速度アップに繋がるんです。
—
どうすればこの魔法を使えるの?
やり方はとってもシンプルです。テーブルを作るときに、どの範囲のデータを持っているかをPostgreSQLに教えてあげるだけ。
例えば、こんな風に定義します。
CREATE TABLE sales_2023 (
CHECK (sale_date >= ‘2023-01-01’ AND sale_date <= '2023-12-31')
) INHERITS (sales);
こうしておけば、`WHERE sale_date = '2023-05-15'` というクエリを投げたときに、PostgreSQLは「お、このテーブルには5月15日のデータがある可能性があるな。よし、検索しよう!」と判断してくれます。逆に、2024年のデータを探すときには、このテーブルを完全に無視してくれるわけです。
---
最後に:完璧を求めすぎないで
ただし、一つだけ注意点があります。この機能は「プランナが賢く判断できるとき」にしか発動しません。
例えば、`WHERE sale_date = now()` のように、実行するタイミングによって結果が変わるような曖昧な条件だと、プランナも「うーん、今日はどのテーブルを見ればいいのか確信が持てないぞ……念のため全部見るか!」と、結局全部の棚をひっくり返すことになってしまいます。
まずは、「検索の条件を明確にする」こと。これが、データベースを速くする一番の近道です。
皆さんも、もし大きなデータを扱う機会があったら、ぜひこの「ラベルを貼って探し物をする」という工夫を思い出してみてください。きっと、PostgreSQLがこれまで以上にキビキビと動いてくれるはずですよ!
それでは、また次回の記事でお会いしましょう。ハッピー・クエリライフを!
コメント