web-dev-qa-db-ja.com

ファイルグループのテーブルに制約を追加すると、デフォルトでどのファイルグループに制約が作成されますか?

次のような複数のファイルグループがあります。

  1. PRIMARY(デフォルト)
  2. アプリデータ
  3. app_index

ファイルグループapp_dataにテーブルを作成すると

CREATE TABLE Person
(
    [PersonID] INT NOT NULL IDENTITY,
    [Identifier] NVARCHAR(64) NOT NULL,
    [SupervisorID] INT NULL
) ON app_data

現在の設定では(私はこれを作成していません)制約が3つの異なる方法で追加されます

-- Primary keys are added to app_data
ALTER TABLE Person ADD CONSTRAINT PK_Person
    PRIMARY KEY (PersonID) ON app_data

-- Foreign keys are added to "nothing"
ALTER TABLE Person ADD CONSTRAINT FK_Person_PERSON
    FOREIGN KEY (SupervisorID) REFERENCES Person(PersonID)

-- Unique Indexes are added on app_index
-- Sometimes also with constraint notation (but these are the same in background anyway)
CREATE INDEX UX_Person_Identifier
    ON Person(PersonID) ON app_index

外部キーはどのファイルグループに作成されますか? app_dataまたはPRIMARY

すべての制約をapp_indexに作成する必要がありますか?または、このファイルグループに「カスタム」インデックスのみを作成する必要がありますか?

3
Staeff

PRIMARY KEYおよびUNIQUE制約のみにオプションのON filegroup句があります。これは、これらの制約が常に一意性をサポートする自動インデックスを作成するためです。 filegroup句は、このインデックスをどこに置くかを決定するので、あなたの場合、それは常に 'app_index'であるべきです。

FOREIGN KEYCHECKDEFAULTなどの他の制約のファイルグループを指定することはできません。

すべての制約(それらの名前、テーブル、列など)に関するメタデータはシステムテーブルに保持されるため、(デフォルトのファイルグループを変更した場合でも)常にPRIMARYファイルグループにあります。

ところで、少なくともデータベースのPRIMARYファイルグループを常に復元する必要があるのはそのためです。それがなければ、SQL Serverが利用できるデータベースコンテンツに関するメタデータはありません。これが、少なくともエンタープライズシナリオでは、メタデータにPRIMARYファイルグループonlyを使用することをお勧めする理由です。少なくとも1つの他のファイルグループを用意し、それをデフォルトとして設定します。このように、PRIMARYは可能な限り最小のサイズを維持し、破損のリスクを最小限に抑えます。

3
TToni