一般的に、句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は、データ交換の量を減らすために見