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

JavaでのSQLの書き方

ちょっと小ネタです。 通常SQLを記述する場合、縦に分けて書くのが見た目にも見やすく、保守性も高いです。 例として

と書くよりは、 [ …

no image

論理設計のグレーノウハウ サロゲートキー

前回まではアンチパターンやバッドノウハウについて学習してきましたが、今回はグレーノウハウについて特集します。 グレーノウハウとは読んで字のごとくホワイトともブラックとも言えないという手法ですね。 つま …

no image

MySQLでのlocalhostと127.0.0.1の違い

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

no image

ロック(排他制御)について

ECなどでの開発の場合、当然在庫数によって購入できるか、いなかがかわってきますが、複数人で同時にアクセスする際、処理の整合性を見る必要がでてきますので、ロックのが概念が大事になってきます。 そこでロッ …

no image

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

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

アーカイブ