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

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

ただいまの
回答率

90.33%

  • SQL

    2570questions

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

  • SQL Server

    622questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 6,618

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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を行うことができます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

SELECT 名前 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列をクラスター化インデックスに指定してあげてください。
詳しい理由は文字数の制限上述べられませんが、クラスター化インデックス作成にも細かいルールがあります。文字列や日付は、データサイズの関係上あまりいいとは言えません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • SQL

    2570questions

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

  • SQL Server

    622questions

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