【入門編】 制約除外 (Constraint Exclusion) – PostgreSQL

こんにちは!データベースの世界へようこそ。

普段、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がこれまで以上にキビキビと動いてくれるはずですよ!

それでは、また次回の記事でお会いしましょう。ハッピー・クエリライフを!

コメント

タイトルとURLをコピーしました