oracle replaced by UNION OR (applicable to index column)

Typically, the replacement WHERE clause OR UNION will play with good results using OR indexed column will result in a full table scan. Note that the above rule is only valid for a plurality of column index. If there is no column index, query efficiency may be because you have no choice but to reduce OR.

   In the example below, the indexes are built on LOC_ID and REGION.

Efficient:

   SELECT LOC_ID, LOC_DESC, REGION

   FROM LOCATION

   WHERE LOC_ID = 10

   UNION

   SELECT LOC_ID, LOC_DESC, REGION

   FROM LOCATION

   WHERE REGION = “MELBOURNE”

Inefficient:

   SELECT LOC_ID, LOC_DESC, REGION

   FROM LOCATION

   WHERE LOC_ID = 10 OR REGION = “MELBOURNE”

If you insist on using OR, it would need to return to record minimal index column written on the front.

note:

WHERE KEY1 = 10 (returns the minimum record)

OR KEY2 = 20 (return up record)

The above is converted to the internal ORACLE

WHERE KEY1 = 10 AND

((NOT KEY1 = 10) AND KEY2 = 20)       

 

The following test data for reference : (a = 1003 returns a record , b = 1 returns 1003 records )

SQL> select * from unionvsor /*1st test*/

  2   where a = 1003 or b = 1;

1003 rows selected.

Execution Plan

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

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   CONCATENATION

   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

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

   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

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

Statistics

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

          0  recursive calls

          0  db block gets

        144  consistent gets

          0  physical reads

          0  redo size

      63749  bytes sent via SQL*Net to client

       7751  bytes received via SQL*Net from client

         68  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

       1003  rows processed

SQL> select * from unionvsor /*2nd test*/

  2  where b  = 1 or a = 1003 ;

1003 rows selected.

Execution Plan

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

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   CONCATENATION

   2    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

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

   4    1     TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

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

Statistics

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

          0  recursive calls

          0  db block gets

        143  consistent gets

          0  physical reads

          0  redo size

      63749  bytes sent via SQL*Net to client

       7751  bytes received via SQL*Net from client

         68  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

       1003  rows processed

SQL> select * from unionvsor /*3rd test*/

  2  where a = 1003

  3  union

  4   select * from unionvsor

  5   where b = 1;

1003 rows selected.

Execution Plan

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

   0      SELECT STATEMENT Optimizer=CHOOSE

   1 0 SORT (UNIQUE)

   2    1     UNION-ALL

   3    2       TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

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

   5    2       TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR'

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

Statistics

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

          0  recursive calls

          0  db block gets

         10  consistent gets  

          0  physical reads

          0  redo size

      63735  bytes sent via SQL*Net to client

       7751  bytes received via SQL*Net from client

         68  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

       1003  rows processed

By UNION can effect the consistent gets and SQL * NET seen to reduce the amount of data exchange

Guess you like

Origin www.cnblogs.com/fanweisheng/p/11125145.html