SQLShack (日本語)
インデックスは、SQL Serverのクエリプロセスを高速化するために使用されるため、高い結果が得られます。パフォーマンス。それらは教科書の索引に似ています。教科書では、特定の章に移動する必要がある場合は、索引に移動し、その章のページ番号を見つけて、そのページに直接移動します。インデックスがなければ、目的の章を見つけるプロセスは非常に遅くなります。
同じことがデータベースのインデックスにも当てはまります。インデックスがない場合、DBMSは、目的の結果を取得するために、テーブル内のすべてのレコードを調べる必要があります。このプロセスはテーブルスキャンと呼ばれ、非常に低速です。一方、インデックスを作成する場合、データベースは最初にそのインデックスに移動し、次に対応するテーブルレコードを直接取得します。
SQLServerには2つのタイプのインデックスがあります。
- クラスター化インデックス
- 非クラスター化インデックス
クラスター化インデックス
クラスター化インデックスは、データがテーブルに物理的に格納される順序を定義します。テーブルデータは唯一の方法で並べ替えることができるため、テーブルごとに1つのクラスター化インデックスしか存在できません。 SQL Serverでは、主キー制約により、その特定の列にクラスター化インデックスが自動的に作成されます。
見てみましょう。まず、次のスクリプトを実行して「schooldb」内に「student」テーブルを作成するか、ライブデータを使用している場合はデータベースが完全にバックアップされていることを確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
CREATE DATABASE schooldb
CREATETABLE学生
(
id INT PRIMARY KEY、
name VARCHAR(50)NOT NULL、
性別VARCHAR(50)NOT NULL、
DOB日時NOTNULL、
total_score INT NOT NULL、
city VARCHAR(50)NOT NULL
)
|
通知ここで「学生」テーブルにprimaを設定しました「id」列のryキー制約。これにより、「id」列にクラスター化インデックスが自動的に作成されます。特定のテーブルのすべてのインデックスを表示するには、「sp_helpindex」ストアドプロシージャを実行します。このストアドプロシージャは、テーブルの名前をパラメータとして受け入れ、テーブルのすべてのインデックスを取得します。次のクエリは、学生テーブルで作成されたインデックスを取得します。
1
2
3
4
5
|
使用schooldb
EXECUTE sp_helpindex student
|
上記のクエリは次の結果を返します:
index_name | index_description | index_keys |
PK__student__3213E83F7F60ED59 | PRIMARYにあるクラスター化された一意のプライマリキー | id |
出力には、インデックスが1つだけ表示されます。これは、「id」列の主キー制約のために自動的に作成されたインデックスです。
このクラスター化インデックスレコードを「id」の昇順でstudentテーブルに格納します。したがって、挿入されたレコードのIDが5の場合、レコードはテーブルの最初の行ではなく5番目の行に挿入されます。同様に、4番目のレコードのIDが3の場合、4番目の行ではなく3番目の行に挿入されます。これは、クラスター化インデックスが、インデックス付けされた列、つまりIDに従って、格納されたレコードの物理的な順序を維持する必要があるためです。この順序付けの動作を確認するには、次のスクリプトを実行します。
上記のスクリプトは、studentテーブルに10個のレコードを挿入します。ここで、レコードは「id」列の値のランダムな順序で挿入されますが、id列のデフォルトのクラスター化インデックスのため、レコードは「id」列の値の昇順で物理的に格納されます。次のSELECTステートメントを実行して、studentテーブルからレコードを取得します。
1
2
3
4
5
|
USE schooldb
SELECT * FROM学生
|
レコードは次の順序で取得されます。
カスタムクラスター化インデックスの作成
独自のカスタムインデックスとデフォルトのクラスター化インデックスを作成できます。テーブルに新しいクラスター化インデックスを作成するには、最初に前のインデックスを削除する必要があります。
インデックスを削除するには、「オブジェクトエクスプローラー->データベース-> Database_Name- テーブル-> Table_Name- >インデックス”。削除するインデックスを右クリックして、[削除]を選択します。 。以下のスクリーンショットを参照してください。
では、新しいクラスター化インデックスを作成するには、次のスクリプトを実行します。
1
2
3
4
5
6
|
use schooldb
CREATE CLUSTERED INDEX IX_tblStudent_Gender_Score
ON student(gender ASC、total_score DESC)
|
creのプロセスクラスター化インデックスの作成は、1つの例外を除いて、通常のインデックスと同様です。クラスタ化インデックスでは、「INDEX」の前にキーワード「CLUSTERED」を使用する必要があります。
上記のスクリプトは、studentテーブルに「IX_tblStudent_Gender_Score」という名前のクラスター化インデックスを作成します。このインデックスは「gender」列と「total_score」列に作成されます。複数の列に作成されたインデックスは、と呼ばれます。 「複合インデックス」。
上記のインデックスは、最初にすべてのレコードを性別の昇順で並べ替えます。 2つ以上のレコードで性別が同じである場合、レコードは「total_score」列の値の降順で並べ替えられます。単一の列にクラスター化インデックスを作成することもできます。ここで、からすべてのレコードを選択すると、学生テーブルの場合、次の順序で取得されます。
非クラスター化インデックス
非クラスター化インデックスは、テーブル内の物理データを並べ替えません。実際、非クラスター化インデックスは1つの場所に保存され、テーブルデータは別の場所に保存されます。これは、本のコンテンツが1つの場所にあり、インデックスが別の場所にある教科書に似ています。これにより、複数の非クラスター化が可能になります。テーブルごとのインデックス。
ここで重要なのは、テーブル内ではデータがクラスター化インデックスで並べ替えられることです。ただし、非クラスター化インデックス内では、データは指定された順序で格納されます。インデックスには次のものが含まれます。インデックスが作成される列の値と、列の値が属するレコードのアドレス。
インデックスが作成された列に対してクエリが発行されると、データベースは最初にインデックスに移動し、テーブル内の対応する行のアドレスを探します。次に、その行アドレスに移動し、他の列値をフェッチします。非クラスター化インデックスがクラスター化インデックスよりも遅いのは、この追加の手順によるものです。
非クラスター化インデックスの作成
非クラスター化インデックスを作成するための構文は、次のようになります。クラスター化インデックスのそれ。ただし、非クラスター化インデックスの場合、キーワード「CLUSTERED」の代わりに「NONCLUSTERED」が使用されます。次のスクリプトを見てください。
1
2
3
4
5
6
|
use schooldb
CREATE NONCLUSTERED INDEX IX_tblStudent_Name
ON student(name ASC)
|
上記のスクリプトは、学生テーブルの「name」列に非クラスター化インデックスを作成します。インデックスは名前で並べ替えられます昇順。前述したように、テーブルデータとインデックスは異なる場所に保存されます。テーブルレコードは、クラスター化されたインデックスがある場合はそれによって並べ替えられます。インデックスはその定義に従って並べ替えられ、別々に保存されます。テーブルから。
学生テーブルデータ:
IX_tblStudent_Nameインデックスデータ
名前 | 行アドレス |
アラン | 行アドレス |
Elis | 行アドレス |
ジョリー | 行アドレス |
Jon | 行アドレス |
Joseph | 行アドレス |
ケイト | 行アドレス |
ローラ | 行アドレス |
マウス | 行アドレス |
サラ | 行アドレス |
ワイズ | 行アドレス |
通知、ここでインデックスのすべての行には、名前が属する行のアドレスを格納する列があります。したがって、「Jon」という名前の学生の性別とDOBを取得するためにクエリが発行されると、データベースは最初にインデックス内の「Jon」という名前を検索します。次に、「Jon」の行アドレスを読み取り、「student」テーブルのその行に直接移動して、Jonの性別と生年月日を取得します。
結論
ディスカッションからクラスター化インデックスと非クラスター化インデックスの間には、次の違いがあります。
- テーブルごとにクラスター化インデックスは1つしか存在できません。ただし、1つのテーブルに複数の非クラスター化インデックスを作成できます。
- クラスター化インデックスは、テーブルのみを並べ替えます。したがって、余分なストレージを消費しません。非クラスター化インデックスは、実際のテーブルとは別の場所に格納され、より多くのストレージスペースを要求します。
- クラスター化インデックスは、追加のルックアップ手順を必要としないため、非クラスター化インデックスよりも高速です。
Benの他の優れた記事
SQLServerのID &シーケンスの違い
SQL Serverのクラスター化インデックスと非クラスター化インデックスの違いは何ですか?
- 作成者
- 最近の投稿
ベンリチャードソンによる投稿をすべて表示
- Power BI:ウォーターフォールチャートと結合されたビジュアル-2021年1月19日
- Power BI :動作中の条件付き書式とデータの色-2021年1月14日
- Power BI:SQLServerとMySQLからのデータのインポート-2021年1月12日
573,279ビュー
©2021Quest Software Inc. ALL RIGHTSRESERVED。 | GDPR |利用規約|プライバシー