3

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
);

そして、ここに私の質問があります:

  1. 宣言で列の順序のみを変更する2つの一意の制約を作成するポイントは何ですか?

  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 つ目の単一列インデックス?

4

2 に答える 2

4

あなたの質問は次のとおりです。

特定の状況で、2 つのインデックスを作成することは正当化されるでしょうか? (index_id, index_date) の 1 つの複数列インデックスと (index_date) の 2 番目の単一列インデックス?

答えは「はい」です。最初のインデックスは、次のような条件でクエリを満たすために使用されます。

  • index_idでのフィルタリングwhere
  • index_idでフィルタリングindex_dateするwhere
  • index_id句でのフィルタリングwhereと順序付けindex_date

このような状況では、2 番目のインデックスは使用されません。次の目的で使用されます。

  • index_dateでのフィルタリングwhere

この場合、最初のインデックスは使用されません

インデックス内の列の順序は重要です。それらは左から右に使用されます。したがって、これら 2 つのインデックスは便利です。ただし、index_id最初のインデックスは、そのインデックスが使用されるのと同じ状況を既に処理しているため、3 番目のインデックスだけでは役に立ちません。

于 2013-07-12T11:40:14.397 に答える