【SQL Server】SQLのパフォーマンスを向上させるためにインデックスを活用する!

SQLのパフォーマンス

業務でSQLの性能向上をしましたので、SQLのパフォーマンスを上げるためのテクニックをまとめました!

まずは、SQLのチューニングをする前に開発段階で性能を向上させるためのノウハウです。

インデックスを活用する

SQLにはインデックスがついております。

膨大なデータから特定の条件のデータ(WHERE句で指定したデータなど)を検索する際にインデックスを活用することで処理が速くなります。

イメージとして、英語辞典で単語を調べる際に、1ページからパラパラめくって調べるのではなく、索引を用いて該当するページを開くような役割をしてくれています。

このようにインデックスを活用した検索方法をSeek(シーク)といいます。

一方で、テーブルデータを先頭から順番に1つずつ該当するデータか探すような検索方法をScanといいます。

 

SQL Serverでは3種類のインデックスがあります。

1. クラスター化インデックス
2. 非クラスターインデックス
3. 付加列インデックス

 

1.クラスター化インデックス

クラスター化インデックスはルートノード、中間ノード、リーフノードの各ノードを持つ構造を取っています。

現在、社員ID、社員名、部署をカラムとして持つテーブルがあると想定し、社員IDにクラスター化インデックスを貼ると以下のような構造を取ります。

ルートノードには、社員ID10000ずつに対応したインデックスファイルがあり、さらにインデックスファイルは中間ノードと紐づいています。中間ノードには、社員ID1000ずつに対応したインデックスファイルがあり、それらがリーフノードと紐づいています。

リーフノードには、実データが格納されており実際の社員ID、社員名、部署のデータが存在しています。

 

クラスター化インデックスの構造

今、SELECT * FROM 社員テーブル WHERE ID=10003というクエリを実行します。

すると以下の手順で実データを取得します。

1.ルートノードを参照し、ID=10003に該当するインデックスファイルを特定する。(この場合、インデックスファイルBが該当する)

2.インデックスファイルBを参照し、ID=10003に該当するインデックスファイルを特定する。

3.インデックスファイルBAを参照し、ID=10003に該当する実データを取り出す。

クエリの実行

 

 

2.非クラスター化インデックス

クラスター化インデックスとは別にSQL Serverでは非クラスター化インデックスと呼ばれるインデックスもあります。

こちらは、次のような構成になっています。