Steve O'Hearn による「SQL Certified Expert Exam Guide」で、次の段落を見つけました。
まれに、同じインデックスを呼び出す複数の制約と共に複合インデックスを作成する場合、特別な構文が必要になります。たとえば、INVOICES テーブルの両方の列に複合インデックスを作成する場合は、次の構文を使用できます。
CREATE TABLE invoices
(
invoice_id NUMBER(11),
invoice_date DATE,
CONSTRAINT un_invoices_invoice_id UNIQUE (invoice_id, invoice_date)
USING INDEX (CREATE INDEX ix_invoices
ON invoices(invoice_id, invoice_date)),
CONSTRAINT un_invoices_invoice_date UNIQUE (invoice_date, invoice_id)
USING INDEX ix_invoices
);
そして、ここに私の質問があります:
宣言で列の順序のみを変更する2つの一意の制約を作成するポイントは何ですか?
1 つの複数列インデックスを作成しました。最初の列として「invoice_id」、2 番目の列として「invoice_date」です。しかし、「invoice_id」の関与なしに、「invoice_date」自体に関連するクエリを頻繁に実行すると仮定しましょう。"invoice_date" に 2 番目の単一列インデックスを作成することをお勧めしますか? そんなこと知ってる:
Oracle は複数列のインデックスをサポートしているため、誤って "重複" インデックス ( DML にオーバーヘッドを追加し、SQL 実行の高速化に役立たないインデックス) を作成するのは簡単です。 [ソース]
また、次のことも知っています。
スキップ スキャンのおかげで、複合インデックス内の任意の列を参照する WHERE 句は、その処理でインデックスを呼び出す可能性があります。[スティーブ・オハーン]
しかし、私は次のことも知っています:
これは、単純な 1 列の index ほど有益ではありません。その利点は、最初の列の値の一意性によって異なります。[スティーブ・オハーン]
したがって、このテーブルで DML コマンドをめったに使用しないと仮定し、SELECT の WHERE 句の両方の列を "index_date" または "index_id" に個別に関連付ける頻度が高いと仮定します。特定の状況で、2 つのインデックスを作成することは正当化されるでしょうか? (index_id, index_date) の 1 つの複数列インデックスと (index_date) の 2 つ目の単一列インデックス?