質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

16484閲覧

「クラスター化インデックス」と「非クラスター化インデックス」

pinchhachance

総合スコア12

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/02/24 09:25

「クラスター化インデックス」と「非クラスター化インデックス」の違いがいまひとつピンとこないので、
できる限りわかりやすく教えていただきたいです(例え等あると有り難いです)。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

漢和辞典を想像してもらえるとわかりやすいですが、ふつう部首順、そして同じ部首での画数順に並んでいて、そして別に音訓索引、総画数索引がついています。

この場合、(部首、部首内での画数)が「データ自体をその順序に並べてある」クラスター化インデックスで、音訓索引、総画数索引が非クラスター化インデックスです。

投稿2017/02/24 09:37

maisumakun

総合スコア145201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答しようしようと思って忘れていました。

質問は、分かりやすい回答、ですが分かりにくい回答の方も書いておきます。
結局なぜクラスター化インデックスを使うのか、どんな時に非クラスター化インデックスを使うのか、その日本語情報を見たことがないため必要だろうと思うからです。

以下はSQL Server限定の話です。

SQL ServerではID列を持つテーブル全てでクラスター化インデックスを採用することを推奨しています。その理由について述べます。

2つのインデックスの構造上の違いはmaisumakunさんが述べた通りです。
が、厳密にはちょっと違います。

「クラスター化インデックス」の有無で以下が変わってきます。
・テーブルの構造
・非クラスター化インデックスの構造

つまり、2つのインデックスは全然別物ということです。
クラスター化インデックス とは「テーブル構造を決定するルール」のことです。
ある本における文章構成それ自体を決めるルールのことをそう呼んでいます。
実際には索引そのもののことではないんです。

一方、非クラスター化インデックスは言葉通り「索引」データです。

漢和辞典で言えば、辞典最後の索引部分が非クラスター化インデックスです。
一方、「部首ごとに並べ替えを行う」という辞典のルールそのものが「クラスター化インデックス」です。

部首の並び順が予め分かっていれば、別に索引を引かなくても漢字辞典は引けますよね。
例えば「あいうえお順」に並んでいる国語辞典ではあなたは索引ページを見ないと思います。
プログラムにとっても同じことで、クラスター化インデックスのルールを元にデータ本体を特定することができます。そのためにインデックスと呼んでいるわけです。

この小さな解答欄では説明しきることが難しい程クラスターインデックスは奥が深いので、その一部だけ説明します。

#テーブルとインデックスの構造の違い

クラスター化インデックスがある場合
クラスター化インデックスがある場合、データはそのインデックス順に並べられています。
例えば、貴方が人名をクラスター化インデックスに指定したとします。

その場合、以下のデータをどの順序で登録したとしても、テーブルは以下のようなレイアウトになります。

名前,生れ年,身長 かわしま,1983,185cm にしかわ,1986,183cm はやし,1987,195cm ひがしぐち,1986,184cm

この場合、非クラスター化インデックスを生まれ年に作ると、インデックスのデータは以下のようになります。

1983,かわしま 1986,にしかわ 1986,ひがしぐち 1987,はやし

インデックスを作りたい対象に対して、どのデータを見ればいいかの索引を作ります。

このため、以下のようなクエリを実行するとこのテーブルでは非クラスター化インデックスしか使用しません。実テーブルを見に行かないんです。

SQL

1SELECT 名前 FROM 選手 WHERE 生まれ年=1986

クラスター化インデックスというのは、つまりこの「索引に使われる単語」を決めるインデックスです。
それに基づいてテーブル全体を最適化します。
非クラスター化インデックスは、ある行を特定する情報の索引ですから、クラスター化インデックスキーとの対応表になります。

クラスター化インデックスがない場合

同じデータを登録したとしましょう。
でもテーブルには名前に基づくクラスター化インデックスが無い場合、このようになります。

行番号,名前,生れ年,身長 1,かわしま,1983,185cm 2,にしかわ,1986,183cm 3,はやし,1987,195cm 4,ひがしぐち,1986,184cm

登録順に行番号(RID)が振られます。
これを元に非クラスター化インデックスも作成されます。

1983,1 1986,2 1986,4 1987,3

索引に使われるフィールド情報が無いため、行番号を変わりに保存して索引を作成します。
このために、SELECT 名前 FROM 選手 WHERE 生まれ年=1986を検索すると、索引と本文両方が参照される状態になります。

このようなことから、基本的にはID列をクラスター化インデックスに指定してあげてください。
詳しい理由は文字数の制限上述べられませんが、クラスター化インデックス作成にも細かいルールがあります。文字列や日付は、データサイズの関係上あまりいいとは言えません。

投稿2017/03/03 05:42

編集2017/03/03 05:53
haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下のテーブルに、

id|name

次のデータを投入します。

01,'cccc' 02,'bbbb' 03,'aaaa'

idを指定した索引をクラスター化インデックスとすると、DISK上には次の順序でレコードが書き込まれます。

id|name --+---- 01|cccc 02|bbbb 03|aaaa

nameを指定した索引をクラスター化インデックスにすると、今度はこうなります。

id|name --+---- 03|aaaa 02|bbbb 01|cccc

つまり、クラスター化インデックスに指定されたカラムの順序でレコードはDISKに配置されます。そしてこの順序により、SQLのパフォーマンスも変化します。たとえばORDER BY nameを指定した複数行を参照するSQLの場合、nameを指定したインデックスをクラスター化インデックスに設定し、これを使用する実行計画をオプティマイザが選択すれば、次のレコードが常にDISK上の近い位置(ブロック)に存在するため効率よくI/Oを行うことができます。

投稿2017/02/24 11:37

編集2017/02/24 11:43
SVC34

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問