2016-08-09 9 views
2

私たちの環境にはテーブルがあります。最近、dbaがプライマリキーを作成したいdatetimeをソートすることで、パフォーマンスが大幅に向上することが発見されました。彼はdatetimeの一意性を保証できないので、一度主キーだったidを新しい複合キーに追加しました。プライマリテーブルのコンポジットとしてのプライマリキー

したがって、datetime/idとしてプライマリキーを持つテーブルがあり、クラスタ化インデックスもこのように定義されています。すべてのpk/fkの関係はまだ適切に設定されており、id-idパラダイムに存在します。

lopsided主キーの考えられる問題は何ですか?

この変更でパフォーマンスが大幅に向上しました。

ただし、スキーマでは、実際の「主キー」は2つの列です。おそらく何がうまくいかないでしょうか?

+0

[複数の列を主キー(複合主キー)として使用する理由](http://stackoverflow.com/questions/2626158/why-use-multiple-columns-as-primary-keys-composite-primary -key) – Whencesoever

+1

これは、既存のFK関係を壊さなかったためです。なぜ、datetimeにクラスタ化されていないインデックスを置くだけではないのですか? – Paparazzi

+1

既存の一意の列を主キーとして保持します。次に、datetime列に新しいINDEXを作成します。あなたはデータベースプラットフォームは言及していませんが、これがSql Server 2008(*私は*信じています)以上であれば、インデックス付きの列で永続化されるINCLUDE列を選択することができます。これにより、クラスタード・インデックスに日付を含める/含められる速度に近いものになります。より多くのオプションが必要な場合は、データベースプラットフォームとバージョンを含める必要があります。 – Igor

答えて

2

しないでください! 2つのフィールドで一意のインデックスを設定します。プライマリキーである必要はありません。実際に元の鍵をユニークにしたい場合、これはひどい考えです。

+0

一意のIDに日付を追加することによって一意性が損なわれることはありません。 –

+1

@ Joe:古いPKが 'id'カラムのみに基づいていた場合。しかし、新しいPKは 'id' +' date'カラムとして定義されています。 'id'カラムは重複した値を許すようになりました。これはおそらく望ましくありません。 – sstan

+0

ああ、IDに一意のインデックスがないと、IDは重複する可能性があります。私はID +日付が一意ではないことを暗示していると思った。私は誤解しました。 –

1

EDIT:この回答はSql Serverを想定していました。それがそうでないことが分かったら、私は自分の答えを削除するでしょう。

あなたは詳細をリストしていないので、私は非常に一般的な回答をしなければなりません。私の研究では、ほとんどが短い主キー/クラスタード・インデックスを推奨することが分かっています。

ここで実際のキーはパフォーマンスの向上という意味です。 1つのクエリですか?言い換えれば、この変更は、このデータのすべての操作に有益な、または少なくとも重要なパフォーマンスの影響を与えますか?ユーザーインターフェイス、すべてのレポートなど。または、これを盗んでピーターがポールを支払うのですか?

大部分のレポートが日付に基づくレポートデータベースまたはデータウェアハウスの場合、すべてのレポートに役立つような方法でクラスタ化インデックスをセットアップすることをおすすめします。もの。

他の状況では、クラスタ化されていないインデックスを使用すると、PKのサイズを増やすことなくほぼ同じレベルまたはパフォーマンスが向上します。これはすべてのルックアップで使用されますあなたのデータページでより多くのスペースを占有します。

編集: この記事では、できるかぎりこのトピックについて説明します。

https://www.simple-talk.com/sql/learn-sql-server/effective-clustered-indexes/

+0

OPはSQL Serverを使用していますか? – sstan

+0

良い点、私はSql Serverの質問だけをブラウズしていると思った。 –

1

(本物の場合)あなたが現在見ているパフォーマンス上の利点は、主キーではなく、主キー自体に関連付けられたクラスタ化インデックスによるものです。現在のインデックスに満足しているが、一意性を懸念している場合は、一意のdatetime/idをクラスタードインデックスとして保持する必要がありますが、元の一意のIDを主キーとして戻してください。

これは、このプライマリキーを参照する他のテーブルが、外部キー関係を作成するために、不適切なdatetime列を作成する必要があるという問題も解決します。

+0

正確に...クラスタ化されたインデックスの部分私は疑問に思っていません。この場合は明らかに有益です。なぜ私はクラスタード・インデックスを作成せず、プライマリー・キーだけを残したのか分かりません。彼はパフォーマンスの向上を見ている。彼がしたことによって測定可能です。すべてのIDが同じであるため、結合はそこにあります。 fkの制約があります(idを指しているだけです)。唯一の違いは、テーブル定義に日付列が含まれていることです。 – discosammy

関連する問題