【入門編】 シーケンシャルスキャン – PostgreSQL

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

普段、何気なく使っているアプリやWebサイトの裏側で、データがどうやって取り出されているのか、不思議に思ったことはありませんか?今日は、PostgreSQLというデータベースが、一番基本でありながら、実は一番奥が深い「データの探し方」についてお話ししようと思います。

その名も「シーケンシャルスキャン」。

名前はちょっと難しそうですが、考え方はとってもシンプル。一緒に見ていきましょう!

—

本棚で本を探すとき、どうやって探しますか?

想像してみてください。あなたは今、図書館の大きな書架の前に立っています。目的の本は「どこにあるか分からない」状態です。

こんなとき、あなたはどうやって探しますか?

きっと、一番左端の棚の、一番上の段から順番に、指でなぞりながら「これかな?いや、違う」「次はこれかな?」と、端から端まで全部チェックしていきますよね。

これこそが、まさに「シーケンシャルスキャン」なんです。

データベースの世界では、これを「テーブルの全ページを頭からお尻まで順番に読み込む」と言います。効率が悪そうに見えるかもしれませんが、実はとっても理にかなったやり方なんですよ。

なぜ「全部見る」必要があるの?

「全部見るなんて、時間がかかりそうだし非効率じゃない?」と思うかもしれません。確かに、本が何万冊もあったら大変ですよね。でも、こんな場面ならどうでしょう?

  • そもそも本が数冊しかない場合:

最初から最後まで目を通したほうが、インデックス(索引)を探す準備をするよりも早いですよね。PostgreSQLも同じで、テーブルが小さいときは「わざわざ索引なんて作らずに、全部見たほうが早いよ!」と判断します。

  • 棚にある本を「全部」借り出したい場合:

「図書館にある本を全部リストアップして!」と言われたら、結局は一冊ずつ確認していくしかありません。検索条件が曖昧だったり、データ全部が必要なときは、この方法が最強なんです。

シーケンシャルスキャンが「選ばれる」理由

PostgreSQLには「オプティマイザ」という、いわば図書館の優秀な司書さんがいます。この司書さんは、クエリ(命令)が飛んできた瞬間にこう考えます。

「なるほど、今回は100万件の中からたった1人を探すんだね。だったら索引(インデックス)を使おう!」
「おっと、今回はデータ全部を合計したいんだね。だったら最初から最後まで舐めるように見たほうが速いぞ!」

このように、状況に応じて賢く使い分けているんです。だから、もし皆さんが「シーケンシャルスキャンが走ってる!」とログで見つけても、決して焦る必要はありません。それは「今の状況なら、この方法が一番確実で速いですよ」という司書さんの判断の結果なんですから。

—

まとめ:怖がる必要はありません

「シーケンシャルスキャン=遅い」というイメージを持つ方もいますが、それは誤解です。

  • シーケンシャルスキャンは「端から端まで全探索」する基本の動作。
  • データが少ないときや、全部を読み込む必要があるときは、むしろこれが最適解。

もし、本来なら一瞬で終わるはずの検索で、このシーケンシャルスキャンが長時間走り続けているなら、それは「本棚の整理(インデックスの作成など)」が必要だという、データベースからのサインかもしれません。

そうやって、データベースと対話しながら少しずつチューニングしていくのが、この仕事の醍醐味だったりします。

皆さんの開発ライフが、今日から少しだけ「データベースの裏側」を想像して楽しくなるような、そんなきっかけになれば嬉しいです。それでは、また次回の記事でお会いしましょう!

コメント

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