次のような複数のファイルグループがあります。
ファイルグループ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
に作成する必要がありますか?または、このファイルグループに「カスタム」インデックスのみを作成する必要がありますか?
PRIMARY KEY
およびUNIQUE
制約のみにオプションのON filegroup
句があります。これは、これらの制約が常に一意性をサポートする自動インデックスを作成するためです。 filegroup句は、このインデックスをどこに置くかを決定するので、あなたの場合、それは常に 'app_index'であるべきです。
FOREIGN KEY
、CHECK
、DEFAULT
などの他の制約のファイルグループを指定することはできません。
すべての制約(それらの名前、テーブル、列など)に関するメタデータはシステムテーブルに保持されるため、(デフォルトのファイルグループを変更した場合でも)常にPRIMARYファイルグループにあります。
ところで、少なくともデータベースのPRIMARY
ファイルグループを常に復元する必要があるのはそのためです。それがなければ、SQL Serverが利用できるデータベースコンテンツに関するメタデータはありません。これが、少なくともエンタープライズシナリオでは、メタデータにPRIMARY
ファイルグループonlyを使用することをお勧めする理由です。少なくとも1つの他のファイルグループを用意し、それをデフォルトとして設定します。このように、PRIMARY
は可能な限り最小のサイズを維持し、破損のリスクを最小限に抑えます。