主キーを持ついくつかのテーブルがあるとします。例:
CREATE TABLE Customers (
CustomerID int NOT NULL PRIMARY KEY,
FirstName nvarchar(50),
LastName nvarchar(50),
Address nvarchar(200),
Email nvarchar(260)
--...
)
に一意の主キーがありCustomerID
ます。
伝統的に私はいくつかの追加のカバーするインデックスが必要になるかもしれません。たとえば、CustomerID
またはのいずれかでユーザーをすばやく見つけるにはEmail
:
CREATE INDEX IX_Customers_CustomerIDEmail ON Customers
(
CustomerID,
Email
)
そして、これらは私が何十年もの間作成してきた種類のインデックスです。
一意である必要はありませんが、実際には
インデックス自体は、テーブルスキャンを回避するために存在します。これは、パフォーマンスを向上させるためのカバリングインデックスです(一意性を強制するための制約としてインデックスはありません)。
今日私はちょっとした情報を思い出しました-SQL Serverは次の事実を利用できます:
- 列に外部キー制約があります
- 列には一意のインデックスがあります
- 制約は信頼されています
クエリの実行を最適化するのに役立ちます。実際、SQL Serverインデックスデザインガイドから:
データが一意であり、一意性を適用したい場合は、列の同じ組み合わせで一意でないインデックスの代わりに一意のインデックスを作成すると、クエリオプティマイザーに追加情報が提供され、より効率的な実行プランを作成できます。この場合は、一意のインデックスを作成すること(できればUNIQUE制約を作成すること)をお勧めします。
私の複数列インデックスに主キーが含まれているとすると、この複合インデックスは事実上一意になります。挿入や更新のたびにSQL Serverで強制する必要があるのは、特に制約ではありません。しかし、実際には、この非クラスター化インデックスは一意です。
このデファクトユニークインデックスを実際にユニークであるとマークすることに何か利点はありますか?
CREATE UNIQUE INDEX IX_Customers_CustomerIDEmail ON Customers ( 顧客ID、 Eメール )
SQL Serverがように私には思えることができ、私のインデックスが既にことを実現するスマート十分である、それは主キーが含まれているという事実のおかげでユニーク。
- しかし、おそらくこれはこれを認識していないため、インデックスを一意として宣言すると、オプティマイザに利点があります。
- おそらく、それが挿入と更新の間にスローダウンにつながる可能性があることを除いて、一意性チェックを実行する必要があります-以前は、以前は必要でなかった場所です。
- インデックスが主キーを含んでいるため、インデックスがすでに一意であることが保証されていない場合は除きます。
複合インデックスに主キーが含まれている場合の対処法について、Microsoftからのガイダンスはありません。
一意のインデックスの利点は次のとおりです。
- 定義された列のデータの整合性が保証されます。
- クエリオプティマイザに役立つ追加情報が提供されます。
主キーが既に含まれている場合、複合インデックスを一意としてマークする必要がありますか?または、SQL Server自体でこれを理解できますか?