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

NULLについて

「達人に学ぶSQL徹底指南書」を読み進めていきましたがNULLについていろいろ書いてあるのでメモリます。 Contents1 NULLには未知と適用不能の2パターンがある2 = NULL が使えず I …

no image

リレーションを含んだテーブルでの副問い合わせ

本日はSQLネタです。 下記のようなテーブル構成があったときとします。 注文ヘッダと注文詳細は(1:N)とします。 ここで、product_id=5を含んだ注文ヘッダーレコードを取り出したいとします。 …

no image

MySQLでのlocalhostと127.0.0.1の違い

たまにMySQLでローカルのホストに接続する時に、localhostで接続するときと127.0.0.1で接続するときで挙動が違う(片方だとエラーになり、もう片方だとエラーにならない)などがあるのでちょ …

no image

cakeでのトランザクション、コミット、ロールバック

cakePHP(2.X系)でのトランザクション、コミット、ロールバックについて。 cakePHPでトランザクションを書ける場合、Model内に [crayon-62820595b6c8c7434074 …

no image

slow-query-logについて

データベースを伴う部分でののチューニングですが、大きく分けると SQLを書き直す インデックスを張りなおす プログラム内部でキャッシュを有効化する 設定ファイルの修正 上記のようなかんじになるのではな …

アーカイブ