- 2009-12-14 Mon 23:08:56
- SQL Server
SQL Serverのインデックスの動きがよくわからなかったので確認してみた。
■CREATE TABLE時にPK指定
1> CREATE TABLE t1
2> (col_a int not null
3> ,col_b int not null
4> ,constraint t1_cola_pk primary key(col_a));
5> go
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2073058421;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- -------------- ----------- --------------- --------- --------------
2073058421 t1_cola_pk 1 CLUSTERED 1 1
クラスタ化インデックスが自動で作成されてしまう。
■PK指定時に作成されるインデックスを非クラスタにする
2> CREATE TABLE t2
3> (col_a int not null
4> ,col_b int not null
5> ,constraint t2_cola_pk primary key nonclustered (col_a));
6> go
1>
2> SELECT object_id, name FROM sys.tables WHERE name='t2';
3> go
object_id name
----------- ---------------------------------------------------
2105058535 t2
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2105058535;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- ----------------- ----------- -------------- --------- --------------
2105058535 NULL 0 HEAP 0 0
2105058535 t2_cola_pk 2 NONCLUSTERED 1 1
index_idが0なのはデータ領域(ヒープ?)のことらしい。sys.indexesになんでヒープの情報がでるんだろう。
pkのために作成されたインデックスはnonclusteredになったけど、これをnonuniqueにするオプションはどうも見つけられなかった。多分ユニーク強制。
■あらかじめpk列にインデックスを作成してからpkを指定
1> CREATE TABLE t3
2> (col_a int not null
3> ,col_b int not null);
4> go
1>
2> CREATE INDEX t3_cola_idx ON t3(col_a);
3> go
1> SELECT object_id, name FROM sys.tables WHERE name='t3';
2> go
object_id name
----------- -------------------------------------------------
2137058649 t3
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2137058649;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- ---------- ----------- ------------- --------- --------------
2137058649 NULL 0 HEAP 0 0
2137058649 t3_cola_idx 2 NONCLUSTERED 0 0
1> ALTER TABLE t3 ADD CONSTRAINT t3_cola_pk primary key(col_a);
2> go
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2137058649;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- ----------- --------- ------------- --------- --------------
2137058649 t3_cola_pk 1 CLUSTERED 1 1
2137058649 t3_cola_idx 2 NONCLUSTERED 0 0
クラスタ化インデックスができたのでヒープの情報は消えるが、pk列に索引が2つ付いた状態になってしまう。
事前じコンポジット、もしくはincludeでインデックスを作成しておいて、後からpkを指定することで余計な索引を作成しないようにしたいんだけど、どうもできないっぽい。
pk指定時に索引を作成しないオプションか、既存の索引に後から列をincludeするオプションがもしあるなら教えてください。誰か偉い人。
■CREATE TABLE時にPK指定
1> CREATE TABLE t1
2> (col_a int not null
3> ,col_b int not null
4> ,constraint t1_cola_pk primary key(col_a));
5> go
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2073058421;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- -------------- ----------- --------------- --------- --------------
2073058421 t1_cola_pk 1 CLUSTERED 1 1
クラスタ化インデックスが自動で作成されてしまう。
■PK指定時に作成されるインデックスを非クラスタにする
2> CREATE TABLE t2
3> (col_a int not null
4> ,col_b int not null
5> ,constraint t2_cola_pk primary key nonclustered (col_a));
6> go
1>
2> SELECT object_id, name FROM sys.tables WHERE name='t2';
3> go
object_id name
----------- ---------------------------------------------------
2105058535 t2
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2105058535;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- ----------------- ----------- -------------- --------- --------------
2105058535 NULL 0 HEAP 0 0
2105058535 t2_cola_pk 2 NONCLUSTERED 1 1
index_idが0なのはデータ領域(ヒープ?)のことらしい。sys.indexesになんでヒープの情報がでるんだろう。
pkのために作成されたインデックスはnonclusteredになったけど、これをnonuniqueにするオプションはどうも見つけられなかった。多分ユニーク強制。
■あらかじめpk列にインデックスを作成してからpkを指定
1> CREATE TABLE t3
2> (col_a int not null
3> ,col_b int not null);
4> go
1>
2> CREATE INDEX t3_cola_idx ON t3(col_a);
3> go
1> SELECT object_id, name FROM sys.tables WHERE name='t3';
2> go
object_id name
----------- -------------------------------------------------
2137058649 t3
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2137058649;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- ---------- ----------- ------------- --------- --------------
2137058649 NULL 0 HEAP 0 0
2137058649 t3_cola_idx 2 NONCLUSTERED 0 0
1> ALTER TABLE t3 ADD CONSTRAINT t3_cola_pk primary key(col_a);
2> go
1> SELECT object_id, name, index_id, type_desc, is_unique, is_primary_key
2> FROM sys.indexes WHERE object_id=2137058649;
3> go
object_id name index_id type_desc is_unique is_primary_key
----------- ----------- --------- ------------- --------- --------------
2137058649 t3_cola_pk 1 CLUSTERED 1 1
2137058649 t3_cola_idx 2 NONCLUSTERED 0 0
クラスタ化インデックスができたのでヒープの情報は消えるが、pk列に索引が2つ付いた状態になってしまう。
事前じコンポジット、もしくはincludeでインデックスを作成しておいて、後からpkを指定することで余計な索引を作成しないようにしたいんだけど、どうもできないっぽい。
pk指定時に索引を作成しないオプションか、既存の索引に後から列をincludeするオプションがもしあるなら教えてください。誰か偉い人。
スポンサーサイト
- Newer: SQL Serverのインデックスについて興味深いページ
- Older: SQL Serverno
Comments: 1
- 2012-03-22 Thu 22:15:13
このコメントは管理人のみ閲覧できます
Trackback+Pingback: 0
- TrackBack URL for this entry
- http://hitai.blog72.fc2.com/tb.php/44-2bdb93e9
- Listed below are links to weblogs that reference
- SQL Serverのインデックスについて動きを確認してみた from ヒビコレショウジン