SQL SERVERインデックス最適化シリーズの2:インデックス性能の考慮

2424 ワード

前述したように、インデックスはデータの検索速度を大幅に向上させることができますが、なぜ各カラムにインデックスを構築しないのでしょうか.初心者はこの問題に戸惑うかもしれませんが、通常はどの列がインデックスを構築すべきか、どの列が構築すべきではないか、さらにlikeファジイクエリを行う列もインデックス列として使用されますが、ほとんどの場合、likeはインデックスを使用せず、等しい、大きい、INなどのオペレータだけがインデックスを使用します.SQLSERVERは、データの挿入、更新、削除に対して、対応するインデックスを更新します.これにより、更新時間が大幅に増加するに違いありません.また、データ・ページがいっぱいになっている場合、ページにデータを挿入すると、ページが分裂して破片が発生し(後述)、パフォーマンスに影響します.したがって、インデックスは、更新されたパフォーマンスよりもクエリーのパフォーマンスが重要である場合にのみ作成されます.
インデックス作成を検討するカラム
1.プライマリ・キー2.外部キー3.頻繁に取得されるカラムと、ソート順に頻繁に取得されるカラム
通常、whereの後ろの条件で参照される列は、インデックスを作成することを考慮した列です.ファジイクエリ(likeクエリなど)は、インデックスを作成しない列を除きます.
1.クエリで参照されていないカラムが少ない、または少ない.2つ以上の値しかない列(例えば、男性と女性の2つの値しかない列)3.小さなテーブル(ロー数の少ないテーブルで、SQL SERVERがインデックスに費やされる時間は、テーブルを直接スキャンする時間よりも長い)
SQL SERVERは、インデックスを作成するカラムに対して、このインデックスを維持するために一定の代価を払う必要があります.また、SQLSERVERでは、このカラムのインデックスを使用するかどうかを自動的に分析します.たとえば、男性と女性の2つの値しかないカラムについては、インデックスを作成すると、SQLSERVERが独自に分析すると、インデックス検索を使用する効率が悪いと考えられます.結果セットの割合が大きいため、SQLSERVERは統計データを記録し、次回カラムを検索すると、この統計データに基づいて、変更されたインデックスを使用するかどうかを決定します.
SQLSERVERは、結果セットの割合が比較的大きいカラム(たとえば、100万のデータがあり、検索結果は50万を返します)に対して、そのカラムのインデックスを使用せずに、テーブル全体をスキャンする方法を採用する可能性があります.自分でテストすることができて、2000条のデータを挿入して、1999条のデータが同じで、例えばForumIDが2のは1999条で、ForumIDが3のは1条だけで、この時使用します
SET SHOWPLAN_TEXT ON –      (CTRL+L),              
GO

SELECT * FROM Posts WHERE ForumID=2

ForumID列を使用していないインデックスが見つかります.
SELECT * FROM Posts WHERE ForumID=3

ForumID列のインデックスが使用されます
大量の挿入または更新を行うには、インデックスを削除してからインデックスを再構築し、データを挿入または更新するたびに対応するインデックスを更新し、更新速度に影響を与えないようにします.複合インデックス(2つ以上のカラムからなるインデックスを指し、通常whereの後ろに複数のカラムからなる条件がある場合、これらのカラムを複合インデックスにすることができます)
1)このインデックスは、WHERE句でインデックスキーの最初の列を指定した場合にのみ使用されます.例:
CREATE INDEX Posts_INDEX ON Posts(ThreadID,ForumID)

場合
SELECT * FROM Posts WHERE ForumID=2

クエリはPosts_を使用しませんINDEXインデックス
SELECT * FROM Posts WHERE ThreadID=10

Posts_が使用されますINDEXインデックス
2)インデックスは大きすぎるべきではない(<=8バイトが最も良く、int型は4バイトに相当し、SmallIntは2バイトに相当する).3)まず最も一意性のある列を定義する(順序が異なり、インデックスが異なる)例えば、A列の30%のデータが重複し、B列の10%の列が重複し、C列の25%のデータが重複している場合、インデックスを確立する列の順序はB C Aであるべきである
インデックスを作成するには、フィルタ係数という重要なオプションがあります.次は続きます.