2013年3月23日土曜日

◆インデックスの概要 と自習書を試す環境について

インデックス(Index)の概要
インデックスがない場合の検索時の内部動作

インデックスがないテーブルでは、データがどこに格納されているのかが分かりません。基本的には、データを追加(INSERT)した順に格納されていきますが、データを削除(DELETE)した場合には、その削除された領域は再利用されるので、追加や削除が繰り返される環境では、どこにどのデータが格納されているのかが分からなくなります。これについて、次の「社員」テーブルを例に考えてみましょう。

image

この社員テーブルには、インデックスを作成していません。このとき、次の SELECT ステートメントを実行して、姓が「Aoki」さんの社員を検索したとします。

SELECT * FROM 社員WHERE 姓 = 'Aoki'

SQL Server にとっては、「Aoki」さんのデータは、どこにあるのかが分からず、また、何件の「Aoki」さんがあるのかも分かりません。したがって、SQL Server が該当データを検索するには、次のように先頭から最後まで探し続けなければなりません。

image

このように、インデックスが存在しない場合には、どんなデータを検索する場合にも、必ず先頭から最後まで探し続けなければなりません。この動作は「Table Scan:テーブル スキャン」、「全表走査」、「全件検索」などと呼ばれています。テーブル スキャンは、データ量が 1,000件、2,000件など少ない場合には、(今のコンピューターの性能では)瞬間的に結果が返りますが、1,000万件、1億件など大量データになった場合には大変な実行時間がかかってしまいます。

Note: テーブル スキャンの速度はどれくらい?
テーブル スキャンの速度は、ディスクの読み取り速度(実測値)に大きく依存します。たとえば、テーブル サイズが 500MB で、ディスクの読み取り速度が 100MB / 秒だったとすると、テーブル スキャンには最低でも 5秒かかるわけです(メモリにキャッシュされていない場合)。また、テーブル サイズが 5GB だったとすると、最低でも 50秒はかかってしまうことになります。このように、テーブル スキャンの速度は、データ量が増えれば増えるほど、非常に時間がかかってしまうので、これを解決するための検索手法が「インデックス」です。

グラフィカル実行プラン

SQL Server には、内部的な実行方法(テーブル スキャンが実行されたか、インデックスが利用されたかなど)を簡単に知ることができる、グラフィカル実行プランという機能があります。

image

この機能のおかげで、テーブル スキャンが実行される、効率の悪い検索を簡単に調べることができるので、大変便利です。Step 2 以降では、これらの利用方法を具体的に説明します。

サンプル データベース(sampleDB)の作成

この自習書では、すべての手順でサンプル スクリプトに含まれる「sampleDB」データベースを利用しているので、STEP2 以降を始める前に、このデータベースを SQL Server 2012 上へ作成しておいてください。作成の手順は、次のとおりです。

  1. まずは、[スタート]メニューの[すべてのプログラム]から[Microsoft SQL Server 2012]の[SQL Server Management Studio]をクリックして、Management Studio を起動します。
  2. 接続完了後、次のようにツールバーの[ファイルを開く]ボタンをクリックします。
    image
    これにより、[ファイルを開く]ダイアログが表示されるので、サンプル スクリプトを解凍したフォルダーを展開して、「sampleDB.sql」ファイルを選択し、[開く]ボタンをクリックします。
  3. 次のようにデータベースを作成するためのスクリプトが表示されるので、ツールバーの[実行]ボタンをクリックして、スクリプトを実行します。
    image
  4. 数秒後に実行が完了して、次のように画面下に「クエリが正常に実行されました」と表示されることを確認します。
    image
    以上でデータベースの作成が完了です。

0 件のコメント:

コメントを投稿