パーティションキーもプライマリキーの一部である必要がありますか?


24

主キーではない列に基づいてテーブルをパーティション分割していますか?今日、パーティション列を主キーの一部にする必要があるかどうかに関するいくつかの矛盾する情報を読みました。私の腸はノーと言うが、私は100%確信していない。だから質問...

  1. パーティション列はプライマリの一部である必要がありますか?どちらの方法がお勧めですか?
  2. パーティションキーのインデックスを作成する必要がありますか、それともDBMSが自動的にインデックスを作成しますか?

回答:


11

どういたしまして。

パーティショニングの最も一般的なシナリオの1つは、PKとはまったく関係のない日付フィールドを使用することです。

たとえばOrders、フィールドOrderDateを含むテーブルがある場合、ほとんどの場合、月と年に基づいてパーティションを作成しOrderDateます。

レコードが古くなって関連性がなくなったら、それらのパーティションをアーカイブテーブルまたはデータベースに移動して、処理されないようにすることができます。

パーティショニングはほとんどすべてのフィールドで機能しますが、それがうまく機能するためには、すべてではないにしてもほとんどのクエリで、パーティション化したフィールドを使用する必要があります。パーティションキーを含めないと、本質的に複数のテーブル(パーティション)をスキャンする高価なテーブルスキャンが発生します。

編集

パート2では、答えはノーだと思います。パーティションキーは、行を配置するパーティションを決定するために使用されますが、インデックスが維持されるとは思いません。ただし、バックエンドに統計がある場合があります。


10
これは古いことは知っていますが、間違った道をたどってしまうので、他の人にコメントしたいと思いました。パーティション機能のSWITCH機能を使用する場合は、パーティション列をプライマリキーに含める必要があります。主キーにない場合、次のエラーが表示されます Partition columns for a unique index must be a subset of the index key.
。– Vaccano

私は@Vaccanoに同意する
さん

3

JNKの答えに加えて、おそらくテーブルパーティションとインデックスパーティションの調整について説明しているこの記事を読む必要があります。

パーティション化スキームが主キーの最初の列に正確に従うシナリオは多くの種類があります。たとえば、ファクトテーブルのスナップショットの日付が通常パーティションキーであり、主キーの最初の列であるデータウェアハウスシナリオなどです。

しかし同様に、PKがIDENTITYキーまたは他の代理キーであるOLTP環境では、通常、任意の番号でのパーティション分割はそれほど有用ではないため、パーティションにこれを使用する意味はほとんどありません。OLTPシステムでは、日付ごとに(おそらくPK内ではなく)パーティション分割する傾向がありますが、地域または何らかの種類の組織区分(サロゲートを使用していない場合はPK内)によってもパーティション分割する傾向があります。

しかし、それは要件ではありません。


まあ、たくさんのものは必須ではありません。インデックス付けさえも要件ではありません!機能的に意味をなすためには、候補キーの先頭列でパーティション化を行う必要があります。それ以外の場合、アプリ設計者はどのようにテーブルを使用しますか?
srini.venigalla

@ srini.venigallaこれは一般的なケースですが、別の一般的なケース(同様にそうですか?)は、主キーまたは候補キーの一部ではない何かでパーティション分割することです。パーティション分割はアーカイブによく使用されるため、有効期限適切なパーティションの選択。しかし、それがキーの一部である可能性を示唆するものは何もありません。パーティショニングは非常に一般的な低レベルの機能であり、少なくとも2つの明確で競合する使用パターンがあります。どちらにも正当なベストプラクティスがあります。
ケードルー

0

主キー自体の一部でない場合、候補キーの一部である必要があります。考えてみて、あなたのパーティショニングはそれ自体を主キーに合わせる必要があります。

答えは、はい、PKの一部であることが望ましいです。別のキーではない場合、これはPKとして十分に優れています。


候補キーについて聞いたことがない。Create / Alter tableステートメントでどのように指定しますか?
AngryHacker

候補キーは、主キーとして認定されたもう1つのキーです。たとえば、IDは主キーです。しかし、同じテーブルで、たとえば別の列が PERSON_IDは、候補キーと呼ばれる行を一意に識別することもできます。2番目と3番目の正規化ルールも、すべての候補キーに対して保持する必要があります。
srini.venigalla

わかった。私の質問の2番目の部分はどうですか?
AngryHacker

他のインデックスと同じです。例:CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor(BusinessEntityID);
srini.venigalla

4
これは絶対に間違っています。のように、PKにまったく関係のない多くのフィールドでパーティション分割できOrderDateます。主張を裏付けるものはありますか?
JNK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.