はじめに
SQLの領域では、データ検索の技術はデータ操作の全体的なパフォーマンスにおいて重要な役割を果たします。この記事では、SQLで使用される次のスキャン方法の概要を紹介します。
- フルテーブルスキャン
- インデックスユニークスキャン
- インデックスレンジスキャン
フルテーブルスキャン
フルテーブルスキャンとは、テーブル内の各行が検査され、データが取得される操作を指します。この操作では、テーブルの全てのレコードが調べられ、所望のレコードが取得されるか、そのようなレコードが存在しないことが確認されます。
フルテーブルスキャンは時間がかかる場合があります。特に、テーブルに大量のデータ(100万行以上)が含まれる場合はそうです。この操作は、各レコードが個別にアクセスおよび検査されるため、徹底的な性質を持っています。
ユースケース
フルテーブルスキャンの一般的なユースケースは、テーブルから全てのレコードを選択する場合です。SQLでは、次のコマンドを使用して実行できます。
SELECT * FROM users;
フルテーブルスキャンは、インデックスのない列でフィルタリングする必要がある場合にも使用されます。
SELECT * FROM users WHERE name="hoge";
また、クエリの性質によってはインデックスを効率的に利用できない場合もあります。検索パターンにワイルドカード文字が使用されると、インデックスの効率的な使用が妨げられます。
SELECT * FROM users WHERE name LIKE "%hoge%";
インデックスユニークスキャン
インデックスユニークスキャンは、インデックスを使用してテーブル内の一意のレコードを検索する操作です。単一の一意のレコードを見つけることを目的としており、一度見つかれば検索操作は終了します。
操作の性質上、インデックスユニークスキャンは処理を素早く完了することができます。一意のレコードが見つかると検索が終了するため、大量のデータを扱う場合に特に効率的な方法です。
ユースケース
インデックスユニークスキャンは、主キーまたは一意のキーに基づいてレコードをフィルタリングする場合に通常使用されます。以下はそのようなクエリの例です。
SELECT * FROM users WHERE id=10;
主キーの一意な性質により、この操作は迅速に完了することができます。データベースは要求されたレコードを迅速に見つけて返すことができます。
インデックスレンジスキャン
インデックスレンジスキャンは、インデックスを使用してテーブルから複数の行を取得する検索操作です。インデックスユニークスキャンとは異なり、この方法は1つ以上のレコードを取得することを目的としています。
インデックスレンジスキャンの実行時間は、取得するレコードの数によって異なります。処理時間はターゲットのレコード数に比例します。レコードを取得する数が多いほど、処理に時間がかかります。
ユースケース
インデックスレンジスキャンは、一意のキーではないキーに基づいてフィルタリングする場合に通常使用されます。以下はそのようなクエリの例です。
SELECT * FROM users WHERE age=50;
この場合、操作は指定された条件(年齢が50歳のユーザー)に合致する複数のレコードを取得する可能性があります。
フルスキャンとインデックススキャンの使用時の考慮事項
インデックススキャンは、データセット全体を読み取る必要がないため、しばしば効率的に動作することがあります。必要なデータを直接見つけることができるため、処理時間が短縮されます。
一方、フルスキャンは時間がかかる場合があります。特にデータ量が増えるとさらに時間がかかります。ただし、データのサイズに関係なく一定のパフォーマンスレベルを維持することができます。
スキャン選択の決定要因
-
データ量
フルスキャンとインデックススキャンの選択は通常、データ量によって決まります。データ量が小さい場合(約10,000レコード以下)、インデックススキャンとフルスキャンの処理時間の差は無視できる場合があります。 -
フィルタリング可能なデータの割合
フィルタリングできるデータの割合も、スキャン方法の選択に影響を与えます。フィルタリングするデータが総データの一部である場合、フルスキャンの方が速い場合もあります。フルスキャンとインデックススキャンの有効性は、フィルタリングできるデータの割合に大きく依存します。
フルスキャンとインデックススキャンの選択に関するガイドライン
フルスキャンとインデックススキャンの選択は、フィルタリングされる行の割合と総行数の比率に依存する場合があります。次の表は、どのスキャン方法が好ましいかについて一般的なガイドラインを示しています。
フィルタリングされる行の割合(総行数に対する) | 推奨されるスキャン方法 |
---|---|
20%以上 | フルスキャン |
1%から20% | ケースバイケース(15%未満の場合はインデックススキャンが速いとする意見もあります) |
1%未満 | インデックススキャン |