SQL Serverで一意性を適用するために開発者が好む手法として、UNIQUE CONSTRAINTとUNIQUE INDEXのどちらを使用するか興味があります。それぞれの物理的な実装にほとんど違いがないことを考えれば、どの方法が最適かをどのように判断しますか?
最適なソリューションを評価するために、パフォーマンス以外の理由はありますか?
どちらか一方にデータベース管理の利点はありますか?
2つを比較するこのMSDNの記事はSQL Server 2000に関するものです。 http://msdn.Microsoft.com/en-us/library/aa224827(SQL.80).aspx
ほとんどの場合、違いはありません。制約は隠れたインデックスとして実装されています。また、制約を無効にする機能はありますが、SQL Serverでは実際には機能しません。
FILLFACTORなどの一意の制約を実装する方法を微調整する場合にのみ重要です。
SQL Server 2008以降では、より効率的なカバリングインデックスを提供するためにINCLUDE
が追加されました。フィルターされたインデックス=行のサブセットに対する一意の制約/複数のnullを無視など.
それらは 大幅に異なるわけではありません。 一意の制約を作成すると、SQL Serverは自動的に一意のインデックスを作成します。
インデックスを作成するための構文を使用すると、一意のインデックスを定義して、クラスター化/非クラスター化、含まれる列、ファイルグループ、インデックスフィルター(SqlSvr2008)などを指定する制御を強化できます。
制約は一意性の意図を表すため、ほとんどの場合に適しています。制約です。インデックスはこの意図を伝えません。
管理性に関しては、影響は最小限です。制約とは無関係に作成されたかのように、インデックス(再構築、再編成)を管理できます。唯一の違いは、制約がインデックスに依存するため、インデックスを削除するには、制約も削除する必要があることです。
私の2セント:ビジネスロジックを記述したい場合は制約を使用し、パフォーマンスを向上させたい場合はインデックスを使用します。それらをDBMSで同じように実装できるという事実は、これらのオブジェクトを定義する理由の違いが重要ではないことを意味しません。
一意の制約は一意性のみを意味し、制約を削除すると、エンジンが作成したインデックスが削除されます。インデックスを変更して一意性を削除しても、インデックスは保持されます。一意性を強制する列の大部分は、パフォーマンス上の理由からインデックスとしても機能すると想定できます。エルゴ、私はほとんど一意のインデックスを使用します。一意である必要があるがパフォーマンスにあまり役立たない列(つまり、一意である必要があるvarchar(200))に対してのみ、一意の制約を使用します。そのような場合、私はそれが一意であることを明確に指摘したいと思いますが、基礎となるインデックスにもかかわらず、検索することはおそらくあまり良い考えではありません。