2016-04-18 20 views
0

私は自然な5列の主キーを持つテーブルを持っていますが、私はその主キーを一意のキーに変更する必要があり、私は自動増分の整数主キーを追加したいです。ID列を表の最初の列にする必要がありますか?

IDカラム+クラスタ化されたPKを追加するだけで、IDカラムは常にテーブルの最初のカラムにすることはできますか?私は追加だけで動作することを知っているが、私はパフォーマンスの問題が怖いです。

ID列が最初の場合は、データ移行を行う必要があります。コメントとしてこれを追加しました

+0

詳細と読み取りそれは最初の列 –

+0

しかし、どのようなパフォーマンスについてである必要はありませんですか? – RayCW

+1

http://dba.stackexchange.com/questions/18719/does-the-order-of-columns-in-a-tables-definition-matter –

答えて

2

論理的に定義されたPK列がどこにあるかは実際問題ではありません。ただし、インデックスをクラスタ化したインデックスにすると、インデックス自体がテーブルになるため、常に「開始」に列が配置されますが、データ型やデータの順序には影響しません。ロビンDewsonによる「開発者のためのSQL Server 2008を始まり」から

引用

先に述べたように、クラスタ化インデックスは、実際には特定の順序で テーブル内のデータを保持します。SQL Server は、クラスタ化インデックスとして列(または複数の 列)を指定すると、 のレコードを の順序に対応する正しい昇順または降順で保持するために、そのレコードを物理的な位置に配置しますインデックスに定義されています。これをもう少し説明すると、 顧客番号のクラスタード・インデックスがある場合。データには現在、顧客番号10,6,4,7,2、および5の があります。 SQL Serverは の順に物理的にデータを格納します。 プロセスが顧客番号9を追加すると、物理的には が7と10の間に挿入されます。顧客 番号10のレコードが物理的に移動する必要があることを意味する場合があります。したがって、データ挿入 によって並べ替えられた列または列のセットに クラスタードインデックスが定義されていると、挿入のパフォーマンスが大幅に低下します。 SQL Serverでは インデックスが作成されたときに塗りつぶし係数を指定できるようにすることで、並べ替えの影響を減らす方法を提供しています。

ここで興味深い主題 http://www.sqlskills.com/blogs/paul/inside-the-storage-engine-anatomy-of-a-record/

1

は、それは同様の答えかもしれないと思った(1、より良いが一緒に来て、少なくともまで)

@juergendがPKが最初の列であるために、それは必要はありません言ったように。私は現在、PKのテーブルの終わりに常にあるデータベースに取り組んでいます。これが動作している間、私はそれがPKが正面にあるときにデータを視覚化するのに役立つことを発見します。これはおそらく個人的な好みであり、あなた(そしてあなたの雇用主)は、移住が努力する価値があるかどうかを判断する必要があります。 PKの順序でパフォーマンスに全く影響しません

1

クラスター化されたキーは1つだけです。 PKは、ほとんどの場合、デフォルトでクラスタ化されたキーです(ただし、PKでもクラスタ化されていないと定義することができます)。

違い:クラスタ化されたキーはという物理的なの行を作成します。

挿入が暗黙の順序でない(最悪ですが、かなり一般的ですが)クラスタ化のための列は決して選択しないでください。UNIQUEIDENTIFIERです。これは、(悪い実行中の)クラスタード・インデックスをルックアップとして使用しようとする他のインデックスであっても、断片化が悪くなり、パフォーマンスが低下します。

自動増分列を導入してクラスタールックアップとして役割を果たしようとしています。 - 良いアイデア(あなたがオフラインの挿入を許可したくない限り...)。ご質問

  • いいえ、列の位置は重要ではありません。
  • クラスタ化されたキーが1つしかないため、既存のものを削除して(一意であるがクラスタ化されていないインデックスとして再作成する必要があります)
  • 新しいインデックスのあとにも、ルックアップとして新しいクラスタ化キーを使用するため、存在します。
関連する問題