Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

OracleDB SQLServer

データベースのインデックスの基本と種類とOracleやSQL Serverでの特長について

投稿日:2019年7月28日 更新日:

(0)目次&概説

(1) データベースのインデックスとは
(2) インデックスはどのような場面で使う?
(3) インデックスの主要な方式
 (3-1) B木
 (3-2) B+木
 (3-3) ビットマップ
(4) 各DB製品毎のインデックス概要
 (4-1) Oracleの場合
 (4-2) SQLServerの場合

(1) データベースのインデックスとは

データベースの性能を向上させる技術です。「検索対象項目」と「レコード格納位置ポインタ」の情報を用いて、位置を特定して直接アクセスを行う事で検索速度を向上させます。インデックスが設定されていない場合はテーブルのフルスキャンする(最初から最後まで1件ずつ見る)ため、時間が掛かってしまいます。ただし、インデックスを設定すると検索対象の表の更新速度が下がるというデメリットもあるので、最適な使い方を見極める必要があります。

目次にもどる

(2) インデックスはどのような場面で使う?

インデックスは以下のようなケースで使用します。

①検索対象表の行数が多い場合 
⇒行数が少ないと、テーブルのスキャン時間よりもインデックスの検索の方が時間が掛かるため

②検索対象表の更新(UPDATE)が少ない場合
③検索対象表の追加(INSERT)や削除(DELETE)が少ない場合
⇒INSERT、UPDATE、DELETEを行うとインデックスの調整が必要となるため、大量の更新が発生するテーブルに多数のインデックスを設けると更新処理の性能に影響してしまいます。

目次にもどる

(3) インデックスの主要な方式

(3-1) B木

ツリー状の構造をしており、中央値を根(root)にしつつ、その「子」ノードで左側がrootより小さい値、右側がrootよりも大きい値のキー値とデータを保持します。

同様の規則で更に分解した、リーフノードがあります。データの保持は分岐点(子)と、先端(リーフノード)にて保持しています。
強みとして、子ノードにもデータを持てるため、アクセス頻度が高いノードをより根(root)の近くに置く事で速度向上が見込めます。

目次にもどる

(3-2) B+木

B木と似ているが、違いとしては以下の通り。
(1) 子ノードではキー値のみを保持して、データはリーフノード(端)にまとめて保持しています。
(2) リーフノードのデータ同士がポインタで接続されているため、範囲での検索スピードが向上する

強みとしては、リーフノードが全てポインタで接続されているため、フルスキャン時に1つの直線的な経路で全てのデータにアクセスできる点です(速い)。

目次にもどる

(3-3) ビットマップ

テーブルと対になるビットマップの情報を利用する方式です。テーブルのあるカラムAの値を並べた表(ビットマップ)を作り、レコード毎にカラムAの値の場所にフラグを立てたようなイメージです。
実データの比較をすることなく、ビットの検索のみでレコードを特定できるため、カーディナリティが低い場合は高速で、テーブルをJOINする場合もビット同士のANDやORを行うだけで抽出ができるため高速になります。

 >目次にもどる

(4) 各DB製品毎のインデックス概要

(4-1) Oracleの場合

Oracleでは「B木索引」や「ビットマップ索引」や「ファンクション索引」などがあります。「B木」に関してはSQLの組み方によってはインデックスが効かなくなる可能性があるため注意が必要です。例えば、WHERE句を「OR」で複数指定した場合です。また「B木」と「ビットマップ」の強み弱みを整理すると以下のようになります。

  カーディナリティ
カーディナリティ
非定型SQL ビットマップ
定型SQL B木

 >目次にもどる

(4-2) SQLServerの場合

SQL Serverのインデックスは大きく2種類に分類されます(クラスタ化/非クラスタ化)。代表的な種類とその特徴は以下の通りです。

クラスタ化 Clustered テーブルに1個のみ設定可能(ソートして格納するため)で、主キー作成時に自動的に作成される。B木のリーフノードにデータを保持し、インデックスのキーでソートされた状態でディスクに格納されている。
非クラスタ化 Nonclustered テーブルに999個まで設定可能で、一意キー作成時に自動的に作成される。クラスタ化インデックスと組み合わせて使用可能。
結合条件で頻繁に利用される列に対して利用されます。
非クラスタ化
 ∟複合
Unique 複数の列の組み合わせにより作成されているインデックス。ルート~中間~リーフノードに値を保持するため、速度が低下する恐れがある。
非クラスタ化
 ∟付加
Filtered 上記の複合インデックスで、リーフノードでのみ値を保持したバージョン。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-OracleDB, SQLServer

執筆者:


comment

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

関連記事

JavaのJDBC接続でjava.sql.SQLRecoverableException: Closed Connectionが発生した時の解決メモ

(0)目次&概説 (1) エラー事象の概要  (1-1) エラーの発生状況  (1-2) エラーメッセージ全文 (2) エラーの原因 (3) エラーの対処方法  (3-1) エラーの修正内容  (3- …

SQL Serverで起きる「ハンドシェイクエラー」の原因について

<目次> (1) SQL Serverで起きる「ハンドシェイクエラー」の原因について  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 参考:SSPIとは? (1) SQL …

Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その1)

掲題の通り、LinuxにOracleDB(11g)をインストールする方法について書きます。 ■目次 (0)前提条件 (1)インストール要件の確認 (2)ユーザ/グループ作成 (3)Oracle DBソ …

OracleDB11gのキャラクタセットを変更する手順について(手順編)

(0)目次&概説 (1) 記事の目的 (2) キャラクタセット変更手順  (2-1) CSSCAN実行の準備   (2-1-1) csminst.sqlファイルの確認   (2-1-2) SQL*Pl …

Linuxサーバ(CentOS6)にOracleDB11gをインストールする(その4)

掲題の通り、LinuxにOracleDB(11g)をインストールする方法について書きます。 「(その3)」の続編記事です。 https://rainbow-engine.com/2017/05/05/ …

  • English (United States)
  • 日本語
Top