OracleはUNIONに置き換えOR(インデックス列に適用)

一般的に、句OR UNIONを使用して良い結果で再生されます交換またはインデックス付きの列は、全表スキャンになります。上記のルールは、列インデックスが複数の場合にのみ有効であることに注意してください。何の列が存在しない場合あなたはORを削減するしかないので、インデックスは、クエリの効率であってもよいです。

   以下の例では、インデックスがLOC_IDとREGION上に構築されています。

効率的な:

   LOC_ID、LOC_DESC、地域を選択

   場所から

   WHERE LOC_ID = 10

   連合

   LOC_ID、LOC_DESC、地域を選択

   場所から

   WHERE REGION =「メルボルン」

非効率的な:

   LOC_ID、LOC_DESC、地域を選択

   場所から

   WHERE LOC_ID = 10 OR REGION =「メルボルン」

あなたはORを使用して主張する場合、それは前に書かれた最低限のインデックス列を記録するために返却する必要があります。

注意:

KEY1 = 10(最小レコードを返す)WHERE

OR KEY2 = 20(レコードを返します)

上記内部ORACLEに変換されます。

WHERE KEY1 = 10、

((NOT KEY1 = 10)およびKEY2 = 20)       

 

参考のために次の試験データ:(A = 1003 戻るレコード、B = 1つの戻り1003件のレコード

SQL> SELECT * FROM unionvsor / *第一のテスト*から/

  2ここ= 1003またはb = 1;

1003行が選択されました。

実行計画

-------------------------------------------------- --------

   0 SELECT文オプティマイザ= CHOOSE

   1 0 CONCATENATION

   'UNIONVSOR' 2 1表(INDEX ROWID BY)ACCESS

   'UB'(NON-UNIQUE)3 2 INDEX(RANGE SCAN)

   'UNIONVSOR' 4 1表(INDEX ROWID BY)ACCESS

   'UA'(NON-UNIQUE)5 4 INDEX(RANGE SCAN)

統計

-------------------------------------------------- --------

          0再帰呼び出し

          0デシベルブロックを取得します

        一貫性のある144を取得

          0の物理読み取り

          0のREDOサイズ

      クライアントへのSQL *ネットを経由して送信された63749のバイト

       7751バイトは、クライアントからのSQL * Netのを介して受信

         68 SQL * Netは、クライアントへ/からラウンドトリップ

          0種類(メモリ)

          0種類(ディスク)

       1003行が処理

unionvsor / *第二テスト*からSQL> SELECT * FROM /

  2ここで、B = 1又はA = 1003。

1003行が選択されました。

実行計画

-------------------------------------------------- --------

   0 SELECT文オプティマイザ= CHOOSE

   1 0 CONCATENATION

   'UNIONVSOR' 2 1表(INDEX ROWID BY)ACCESS

   'UA'(NON-UNIQUE)3 2 INDEX(RANGE SCAN)

   'UNIONVSOR' 4 1表(INDEX ROWID BY)ACCESS

   'UB'(NON-UNIQUE)5 4 INDEX(RANGE SCAN)

統計

-------------------------------------------------- --------

          0再帰呼び出し

          0デシベルブロックを取得します

        一貫性のある143を取得

          0の物理読み取り

          0のREDOサイズ

      クライアントへのSQL *ネットを経由して送信された63749のバイト

       7751バイトは、クライアントからのSQL * Netのを介して受信

         68 SQL * Netは、クライアントへ/からラウンドトリップ

          0種類(メモリ)

          0種類(ディスク)

       1003行が処理

unionvsor / *第三の試験*からSQL> SELECT * FROM /

  2 = 1003

  3組合

  4 unionvsorから選択*

  5ここで、b = 1;

1003行が選択されました。

実行計画

-------------------------------------------------- --------

   0 SELECT文オプティマイザ= CHOOSE

   1つの0 SORT(UNIQUE)

   2 1 UNION-ALL

   'UNIONVSOR' 3 2表(INDEX ROWID BY)ACCESS

   'UA'(NON-UNIQUE)4 3 INDEX(RANGE SCAN)

   'UNIONVSOR' 5 2表(INDEX ROWID BY)ACCESS

   'UB'(NON-UNIQUE)6 5 INDEX(RANGE SCAN)

統計

-------------------------------------------------- --------

          0再帰呼び出し

          0デシベルブロックを取得します

         一貫性のある10を取得  

          0の物理読み取り

          0のREDOサイズ

      クライアントへのSQL *ネットを経由して送信された63735のバイト

       7751バイトは、クライアントからのSQL * Netのを介して受信

         68 SQL * Netは、クライアントへ/からラウンドトリップ

          1つのソート(メモリ)

          0種類(ディスク)

       1003行が処理

UNION 行うことができる一貫したが取得すると、SQL * NETは、データ交換の量を減らすために見

おすすめ

転載: www.cnblogs.com/fanweisheng/p/11125145.html