データベースと秋の空・RDBMS掌握術!

第2回 一番の基本,シーケンシャルスキャン ~検索と格納の裏で

この記事を読むのに必要な時間:およそ 3 分

さて,前回の大まかな地図を元に,第2回では実際に問い合わせ手法の詳細について見ていきます。最初に取り上げるのはシーケンシャルスキャンという,データベース検索の最も基本になるアクセス手法です。

シーケンシャルスキャンとは

シーケンシャルスキャンは,日本語に直訳すると「順次検索」という形になります。端的に言ってしまえば「すべてのデータを順に検索する」ということで,結果として通常はすべてのデータを読み込んで返します。その後,検索条件や取得件数などの必要に応じてフィルタリングが行われることもあります。この方法は,すべての件数を対象として検討するため,条件を選ばず使えます。そのほか,どんな複雑なSQLが来てもシーケンシャルスキャンなら取りこぼしがありません。たとえばなんの変哲もない

SELECT * FROM ATABLE;

といったSQLを実行するに当たっては,シーケンシャルスキャンを使います。

図1 シーケンシャルスキャンの実行形

図1 シーケンシャルスキャンの実行形

シーケンシャルスキャンのフロー

さて,これをふまえて,その内部ではなにがどのように行われているか,というところに踏み込んでいきましょう。これは,単純に考えていただければよいのですが,以下の通りになります。

  • まず,ディスクからデータを読みます。
  • (このとき,キャッシュにあればキャッシュから読みます)
  • メモリに展開して,行にばらします。
  • ばらした行に対して,フィルタをかけるなどの処理します。

図2 シーケンシャルスキャンの実行フロー

図2 シーケンシャルスキャンの実行フロー

この一連の動作で,特に時間がかかるのはディスクからデータを読み取る部分です。たいていのディスク読み込み速度はメモリに比べると大変遅いのです。そのため,シーケンシャルスキャンの速度≒ディスク読み込み速度と考えます。

ディスクの読み込みが遅いのに対処するために,メモリ上にキャッシュ機構を持ち,同じデータが頻繁にディスクから読み出されることを防ぐなどの性能上の工夫を凝らします。ディスクキャッシュがどの程度効くか? というのはもちろんケースによりけりです。読み出すテーブルが小さいサイズであればキャッシュが効きやすいため,実行時間がより短くなるケースも出てくるでしょう。逆に,非常に大きなテーブルであった場合,あまり期待は出来ないでしょう。

シーケンシャルスキャンの裏側

ところで,筆者がよく受ける質問に以下のようなものがあります。

「今回のシステムは○○件のレコードを格納する予定なのですが,PostgreSQLで使えますか?」

実際にはこれに「CPUは~,メモリは~,ハードディスクは~」とか,「予算はいくら」とか,そういう前提条件が発生します。この質問だけではあまりにも漠然としていますから,シーケンシャルスキャンに関係のある「○○件の全件検索を行うのに,×秒以内でできますか?」という風に考えましょう。

この質問に対する答えとしては,件数が極端に多い場合には「出来ません」,極端に少なければ「大丈夫です」となります。そういう極端な場合のを除けば,実は「○○件」だけではうまく答えられません。シーケンシャルスキャンの実行時間,つまりディスクからの読み込み量には,件数以外の要素も絡みますから,簡単には答えられません。このギャップを理解しないと,データベースの性能というのはなかなか見えてきません。

著者プロフィール

谷田豊盛(たにだゆたか)

国立明石工業高等専門学校卒。いったん公務員になるが,プログラミングが好きでコンピューター業界に転進。 PostgreSQLを触り出したのは6.3のころから。特にCygwinを使ったWindows環境で使っていたが,それが高じて現在ではPostgreSQLで飯を食うことに。

コメント

コメントの記入