skillup

技術ブログ

Database

インデックスについて(SQLServer)

投稿日:

DBのインデックスについて、今までぼんやりと検索条件の効率化についてはしっていたのですが、もう少し掘り下げて理解する必要があるなと思い、メモります。

SQLServerのインデックスについてすごくまとまっていたページがあるので全体的に以下を参照させていただきました。

SQLServer【Index編】#S2_08_非クラスター化インデックスの作成

インデックスがきかない(適さない)ケース

インデックスのデメリットとしては更新処理が遅くなるなんてことが挙げられますが、それ以外に単純に検索効率が向上しない(or適さない)ケースもあります。

SQLのチューニングに関して

ここ以外の単発の条件以外に、インデックスが意味がないケースはレコードが少ない場合、データのばらつきが少ない場合ですね。

例えばマスターであっても極端に数がすくなかったり(1桁)、性別だったり(基本2種類しかない)場合は不要かと思われます。

データベースのインデックスについて

インデックスの内部的な仕組み

インデックスをはれば、検索効率が向上するということは何となく理解されていると思うのですが、内部的な仕組みについて復習しておこうかと。

インデックスは索引と呼ばれますが、一般的にDBに貼るインデックスはB-treeインデックスといわれるもので、本当の索引とはやや違いデータを探しやすくするしくみですね。

B-treeインデックス入門

上のような構造でデータを格納しているため、データが増えてもそれに対する検索量が上がりにくい仕組みになっています(データ量nに対して、検索アルゴリズムはlognで増えます)。

クラスター化、非クラスター化

インデックス内部にはクラスター化、非クラスター化というものがあります。

主な特徴としては、

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

  • テーブル内に1つまで作成可能
  • 非常に強力(単純なイコールだけでなく、範囲検索や演算子にもきく)
  • 主キー制約で自動的に生成される

非クラスタインデックス

  • ユニーク制約で自動的に決まる
  • 1つのテーブルに999個まで作成できる
  • 検索効率がクラスター化インデックスと比べると落ちる(B-tree+参照を見に行く。特に範囲検索や演算子で不利になる)
  • ディフォルトのcreate index 文だとこちらが作成される

このページが最強にわかりやすかったので、リスペクトもかねてリンクを張ります。

SQL Serverで数億規模のデータを扱って感じた最低限理解しておくべきインデックスの仕組み

クラスター化インデックス と 非クラスター化インデックスの違い

実行計画の見方

MySQLだとexplainで見るかと思うのですが、SQLServerの場合、現在のプロジェクトではSSMSを使ってみており、実行計画が図なんですよね・・・

なれないと苦労します・・

ポイントに関して、全体のSQLに関しては

  • Seek(インデックスがきいている)、Scan(フルスキャン、あるいはそれに近く低速)
  • サブツリーの推定コストが累計の推定コスト(CPUやI/Oのコストはその一部分)

一応図だけではなく、以下のコマンドでテキストでもみれるようですが、わかrにくいので図で頑張って慣れましょう・・・

SQL Server | 実行プランの確認方法

【SQL Server】実行計画を見てみよう

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

HAVING句について

本日はHAVINGについて。 かろうじて用法はしっており、たまに使うこともありますが、あまりしっかり理解しているとはいえない状況ですので、掘り下げてみようと思います。 WHEREとは違い、抽出した結果 …

no image

アンチパターン データ分身の術+DBの不要な連携+バージョンアップ未テスト

今回のアンチパターンは主にデータ設計に関する部分。 Contents1 同一データの使用1.1 デメリット1.2 対策2 DBの不要な連携2.1 デメリット2.2 対策3 サーバーの移行やバージョンア …

no image

ajaxのasync:falseと複数DBのjoinに関して

本日も小ネタ集です。 Contents1 ajax:false2 複数DBでのJOIN ajax:false ajaxは非同期処理が基本ですが、async:falseとすると同期処理になります。 ただ …

no image

データベースのインデックスについて

今回はデータベースのインデックスに関して。 検索条件を早くする場合、何よりも速度が速くなるのはインデックスを張ることでしょう。 インデックスを張ることは単語を索引順に並べることですので、劇的に速度が向 …

no image

エンティティの抽出と主キー決定

主に設計に関することのメモ。 Contents1 業務フロー分析2 エンティティの抽出3 エンティティの関連付け4 主キーの抽出を行う4.1 主キーの特徴4.2 サロゲートキーのメリット4.3 サロゲ …

アーカイブ