Home > スポンサー広告 > SQL Serverのインデックスについて動きを確認してみた

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Comments: -

2012-03-22 Thu 22:15:13

このコメントは管理人のみ閲覧できます

Comment Form
サイト管理者にのみ通知する

Trackback+Pingback: -

TrackBack URL for this entry
http://hitai.blog72.fc2.com/tb.php/44-2bdb93e9
Listed below are links to weblogs that reference
スポンサーサイト from ヒビコレショウジン

Home > スポンサー広告 > SQL Serverのインデックスについて動きを確認してみた

Home > SQL Server > SQL Serverのインデックスについて動きを確認してみた

SQL Serverのインデックスについて動きを確認してみた

  • Posted by: Nakunaru
  • 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するオプションがもしあるなら教えてください。誰か偉い人。
スポンサーサイト

Comments: 1

2012-03-22 Thu 22:15:13

このコメントは管理人のみ閲覧できます

Comment Form
サイト管理者にのみ通知する

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 ヒビコレショウジン

Home > SQL Server > SQL Serverのインデックスについて動きを確認してみた

タグクラウド
Categories
Monthly
Recent Entries
Recent Comments
Recent Trackbacks
Appendix

Nakunaru

    Author:Nakunaru

    データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
    気になる技術を少しずつ勉強していきます。


Return to page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。