web-dev-qa-db-ja.com

Oracleまたは任意のデータベースの複合主キーの順序は重要ですか?

Column1とColumn2を組み合わせた複合主キーがあります。 Column2とColumn1の複合キーがある場合、何が違いますか?列を設定する順序は本当に重要ですか?

5
Shai

それは可能ですが、おそらくあなたが期待する方法ではありません。

Col1とcol2を考えると、人々の最初の本能は、より選択的な列を最初に置くことです。

しかし、ほとんどの場合それは無関係です。

まず、SQLステートメントでのインデックスの使用方法を検討する必要があります。一部のSQLでcol1のみが指定されている場合は、おそらくcol1を最初にする必要があります。すべてのSQLがalwaysを指定してwhere述語で両方の列を指定する場合、どちらが先かは問題ではありません。

しかし、ほとんどのSQLがcol1とcol2の両方を指定し、一部のSQLがcol1またはcol2のみを提供する場合はどうなりますか?

ええと、その場合、最小選択的な列が(おそらく)最初に表示されます。これには2つの理由があります。まず、選択性が最も低いものが最初に来る場合、述語で2番目の列のみが指定されているクエリでは、先頭の列があまり選択的でない場合、OracleはINDEX SKIP SCANを実行する可能性が高くなります。次に、選択性の低い列を最初に配置することで、インデックス圧縮を利用できる可能性が高くなります。

お役に立てば幸いです。

9
Mark J. Bobak

これは本当に、ユーザーがデータにアクセスする方法の問題です。複合キー-これらの列は、このテーブルの行にアクセスするための一意の識別子であると想定しています。もしそうなら、これはこれらの列にユニークなインデックスを作成します。

従来、最も選択的な列が最初にインデックスで使用されます。そして、このアプローチを採用して最高のパフォーマンスを提供することは理にかなっています。

ただし、インデックスホットスポットが検出された場合-インデックスすることができます逆転。

データにアクセスするときに、WHERE句でいずれかの列が欠落している場合も、インデックスが影響を受ける可能性があります。

1
OraNob