
A 回答 (4件)
- 最新から表示
- 回答順に表示

No.4
- 回答日時:
主キーにすると複数の列に対して重複がないようにチェックができます。
例えば住所録で「氏名」と「住所」を主キーにして同姓同名や同住所を許容しつつ二重登録をなくすことができます。インデックスではこのようなことはできないと思います。No.3
- 回答日時:
SQL ServerでデフォルトでPKを作るとクラスタインデックスが作成されます。
簡単に言うとクラスタインデックスは物理的にソートされた状態でデータが格納されます。クラスタインデックスはテーブルに1つしか作成されません。
※物理的にソートするのだから当たり前ですが。
物理的にソートされているので、クラスタインデックスは日付などで範囲検索する時などに有効です。
あえて、PKを非クラスタインデックスで作成し、日付の項目にクラスタ索引をつくることもありです。
あと、索引のカラム順も気をつけたほうがよいです。
検索の時に、索引の先頭のカラムを指定しないと索引を使いません。
Aカラム、Bカラムで索引を作っても、Bカラムのみ指定しても索引を使ってくれません。
※Oracleだとスキップスキャンで、先頭でないカラムを指定しても索引を使ってくれる場合もあります。SQL Serverだとどうなのかは調べてませんが、SQL Server2005の経験上おそらく使いません。
検索パターンに合うようにPKのカラム順を考えたほうがよいです。
PKも項目全て指定するなら問題ないです。
一般的に検索パターンを考慮して索引をつけるつけないを判断します。
パフォーマンス上、問題がなければ索引は作りません。
索引があると更新(Update)に時間がかかりますし、索引の分の領域を使うのでデータベースのファイルサイズが大きくなります。
※索引の分もメンテナンスするのだから当たり前ですが。
マネイジメントスタジオでSQLの実行計画を確認すると、索引を使っているかわかります。一度、みてみることをお勧めします。
No.2
- 回答日時:
SQL Serverに限らず、RDBMS全般として回答します。
主キーやuniqueキーを表定義で指定すると、「内部的に重複禁止のインデクスが作成」されます。これは、RDBMS側で重複チェックする上で、重複禁止のインデクスがないと、母体の全件サーチが必要になるからです。
インデクスは、重複チェック以外に、以下の用途でも利用されます。
(create indexで定義する「重複可のインデクス」の場合もです)
(1)検索条件で絞り込む
(2)集合(集計と呼ぶ場合もあり)関数などでデータを見に行かずにインデクス上で値を得る
(3)order by、group by、distinctなどソートを伴う処理で、作業メモリや作業ファイルを用いたソートを発生させない
なお、参照(整合性)制約の外部キーには、自動的にインデクスは作成されないため、「外部キーにインデクスを定義すべき」と説明しているRDBMSが多いです。
この回答へのお礼
お礼日時:2008/10/15 09:18
chukenkenkou様、回答有難うございます。
特に主キー以外で検索などは必要としない為、
今回はインデックスの設定は行わないことにしました。
詳しく説明ありがとうございます。
No.1
- 回答日時:
主キーというのは、主キー制約という制約の一種です。
だからそれだけでは本来はインデックスとは関係がないのですが、SQL Serverの場合(また他のDBMSでも)、主キー制約をつけると、その列には自動的にユニークインデックスが作成されます。
SQL Server Management Studioで、テーブルの中の「インデックス」の中を見てみると、主キーをつけたテーブルには
自動的に「PK_(テーブル名)」というものができているはずです。
インデックスは索引簿のようなもので、検索効率向上のためにつけるものです。
しかし、ほぼ主キー以外での検索を行わないテーブルであれば、すでにインデックスがついていますので、別途インデックスをつける必要はありません。
もし、テーブルの件数が多く、主キー以外の検索条件で検索することが多いテーブルで、その主キー以外の列を検索条件に指定することで
対象件数の絞り込みの効果が大きい場合、その列に別途インデックスを作成することが多いです。
この回答へのお礼
お礼日時:2008/10/15 09:20
jamshid6様
詳しい回答有難うございます。
今回は主キーのみの検索の為、主キー以外のインデックスの
設定は行わないようにしました。
次回以降参考にします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ビューにインデックスを設定で...
-
「SEOチェキ」の「インデックス...
-
コクヨ タイトルブレーンでイ...
-
年と月が別カラムの場合のSQL
-
【SQLServer】IS NULLのパフォ...
-
効率的なインデックスのつけ方は?
-
SQL Serverの容量見積りについて
-
インデックスの再構築の意味っ...
-
Accessにインポートしたら並び...
-
「マスタ」と「テーブル」の違...
-
ACCESS2007 フォーム 「バリア...
-
3つ以上のテーブルをUNIONする...
-
Access VBA [リモートサーバー...
-
同じ構成のテーブルを結合する
-
オラクルではできるのにSQLSERV...
-
ACCESS VBA コマンドDoCmd.Open...
-
DataTableから条件を満たした行...
-
クエリのキャンセルがいつにな...
-
accessのエクスポートエラーに...
-
SELECT時の行ロックの必要性に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
インデックスの再構築の意味っ...
-
mysql IN句に1データだけ指定...
-
ビューにインデックスを設定で...
-
【SQLServer】IS NULLのパフォ...
-
主キーにインデックスは貼らな...
-
コクヨ タイトルブレーンでイ...
-
年と月が別カラムの場合のSQL
-
Oracleでの検索スピード
-
インデックスの領域について
-
ホームページがGOOGLEにインデ...
-
cron設定について
-
インデックスがすぐに壊れます…
-
サブクエリの使い方を教えて下...
-
効率的なインデックスのつけ方は?
-
Movable TypeとNamazuについて
-
[ BETWEEN ] vs [ >= AND <= ]
-
Google検索はなぜ早い?
-
リリポップサーバーの独自ドメ...
-
intel 945Pチップセットのパフ...
-
インデックスホールディングス...
おすすめ情報