- 締切済み
主キーとインデックスの違いについて
はじめまして。 SqlServerのテーブル作成をしていますが、 主キーとインデックスの違いがよく分かりません。 いつも主キーの設定は行っていますが、インデックスの設定も必要なのでしょうか。(パフォーマンスの向上の為?) 基本的な事ですみませんが ご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
主キーにすると複数の列に対して重複がないようにチェックができます。例えば住所録で「氏名」と「住所」を主キーにして同姓同名や同住所を許容しつつ二重登録をなくすことができます。インデックスではこのようなことはできないと思います。
- 3rd_001
- ベストアンサー率66% (115/174)
SQL ServerでデフォルトでPKを作るとクラスタインデックスが作成されます。簡単に言うとクラスタインデックスは物理的にソートされた状態でデータが格納されます。クラスタインデックスはテーブルに1つしか 作成されません。 ※物理的にソートするのだから当たり前ですが。 物理的にソートされているので、クラスタインデックスは日付などで範囲検索する時などに有効です。 あえて、PKを非クラスタインデックスで作成し、日付の項目にクラスタ索引をつくることもありです。 あと、索引のカラム順も気をつけたほうがよいです。 検索の時に、索引の先頭のカラムを指定しないと索引を使いません。 Aカラム、Bカラムで索引を作っても、Bカラムのみ指定しても索引を使ってくれません。 ※Oracleだとスキップスキャンで、先頭でないカラムを指定しても索引を使ってくれる場合もあります。SQL Serverだとどうなのかは調べてませんが、SQL Server2005の経験上おそらく使いません。 検索パターンに合うようにPKのカラム順を考えたほうがよいです。 PKも項目全て指定するなら問題ないです。 一般的に検索パターンを考慮して索引をつけるつけないを判断します。 パフォーマンス上、問題がなければ索引は作りません。 索引があると更新(Update)に時間がかかりますし、索引の分の領域を使うのでデータベースのファイルサイズが大きくなります。 ※索引の分もメンテナンスするのだから当たり前ですが。 マネイジメントスタジオでSQLの実行計画を確認すると、索引を使っているかわかります。一度、みてみることをお勧めします。
- chukenkenkou
- ベストアンサー率43% (833/1926)
SQL Serverに限らず、RDBMS全般として回答します。 主キーやuniqueキーを表定義で指定すると、「内部的に重複禁止のインデクスが作成」されます。これは、RDBMS側で重複チェックする上で、重複禁止のインデクスがないと、母体の全件サーチが必要になるからです。 インデクスは、重複チェック以外に、以下の用途でも利用されます。 (create indexで定義する「重複可のインデクス」の場合もです) (1)検索条件で絞り込む (2)集合(集計と呼ぶ場合もあり)関数などでデータを見に行かずにインデクス上で値を得る (3)order by、group by、distinctなどソートを伴う処理で、作業メモリや作業ファイルを用いたソートを発生させない なお、参照(整合性)制約の外部キーには、自動的にインデクスは作成されないため、「外部キーにインデクスを定義すべき」と説明しているRDBMSが多いです。
- jamshid6
- ベストアンサー率88% (591/669)
主キーというのは、主キー制約という制約の一種です。だからそれだけでは本来はインデックスとは関係がないのですが、 SQL Serverの場合(また他のDBMSでも)、主キー制約をつけると、その列には自動的にユニークインデックスが作成されます。 SQL Server Management Studioで、テーブルの中の「インデックス」の中を見てみると、主キーをつけたテーブルには 自動的に「PK_(テーブル名)」というものができているはずです。 インデックスは索引簿のようなもので、検索効率向上のためにつけるものです。 しかし、ほぼ主キー以外での検索を行わないテーブルであれば、すでにインデックスがついていますので、別途インデックスをつける必要はありません。 もし、テーブルの件数が多く、主キー以外の検索条件で検索することが多いテーブルで、その主キー以外の列を検索条件に指定することで 対象件数の絞り込みの効果が大きい場合、その列に別途インデックスを作成することが多いです。
お礼
jamshid6様 詳しい回答有難うございます。 今回は主キーのみの検索の為、主キー以外のインデックスの 設定は行わないようにしました。 次回以降参考にします。
お礼
chukenkenkou様、回答有難うございます。 特に主キー以外で検索などは必要としない為、 今回はインデックスの設定は行わないことにしました。 詳しく説明ありがとうございます。