回答編集履歴

2 誤字修正

SVC34

SVC34 score 1127

2017/02/24 20:43  投稿

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

SVC34

SVC34 score 1127

2017/02/24 20:42  投稿

以下のテーブルに、
```
id|name|age
id|name
```
次のデータを投入します。
```
01,'cccc',20
02,'bbbb',30
03,'aaaa',10
01,'cccc'
02,'bbbb'
03,'aaaa'
```
idを指定した索引をクラスター化インデックスとすると、DISK上には次の順序でレコードが書き込まれます。
```
id|name|age
--+----+---
01|cccc| 20
02|bbbb| 30
03|aaaa| 10
id|name
--+----
01|cccc
02|bbbb
03|aaaa
```
nameを指定した索引をクラスター化インデックスにすると、今度はこうなります。
```
id|name|age
--+----+---
03|aaaa| 10
02|bbbb| 30
01|cccc| 20
id|name
--+----
03|aaaa
02|bbbb
01|cccc
```
つまり、クラスター化インデックスに指定されたカラムの順序でレコードはDISKに配置されます。そしてこの順序により、SQLのパフォーマンスも変化します。たとえばORDER BY nameを指定した複数行を参照するSQLの場合、nameを指定したクラスター化インデックスを使用する実行計画を選択すれば、次のレコードが常にDISK上の近い位置(ブロック)に存在するため、効率よくI/Oを行うことができます。
つまり、クラスター化インデックスに指定されたカラムの順序でレコードはDISKに配置されます。そしてこの順序により、SQLのパフォーマンスも変化します。たとえばORDER BY nameを指定した複数行を参照するSQLの場合、nameを指定したインデックスをクラスター化に設定し、これを使用する実行計画をオプティマイザが選択すれば、次のレコードが常にDISK上の近い位置(ブロック)に存在するため効率よくI/Oを行うことができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る