「クラスター化インデックス」と「非クラスター化インデックス」の違いがいまひとつピンとこないので、
できる限りわかりやすく教えていただきたいです(例え等あると有り難いです)。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
漢和辞典を想像してもらえるとわかりやすいですが、ふつう部首順、そして同じ部首での画数順に並んでいて、そして別に音訓索引、総画数索引がついています。
この場合、(部首、部首内での画数)が「データ自体をその順序に並べてある」クラスター化インデックスで、音訓索引、総画数索引が非クラスター化インデックスです。
投稿2017/02/24 09:37
総合スコア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総合スコア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総合スコア1149
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。