BITMAP CONVERSION FROM ROWIDS

示例如下(请自己动手实验):



create table test1 as select * from dba_objects;

create table test2 as select * from dba_objects;

create index idx1 on test1(object_id);

create index idx2 on test1(owner);

create index idx3 on test2(object_id);

create index idx4 on test2(owner);



BEGIN

  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',

                                tabname          => 'TEST1',

                                estimate_percent => 100,

                                method_opt       => 'for  columns owner size 200',

                                no_invalidate    => FALSE,

                                degree           => 1,

                                cascade          => TRUE);

END;

/



BEGIN

  DBMS_STATS.GATHER_TABLE_STATS(ownname          => 'SCOTT',

                                tabname          => 'TEST2',

                                estimate_percent => 100,

                                method_opt       => 'for  columns owner size 200',

                                no_invalidate    => FALSE,

                                degree           => 1,

                                cascade          => TRUE);

END;

/



比如这个SQL:



select * from test1 where owner='SCOTT' or object_id in(select object_id from test2 where owner='SCOTT');



执行计划如下:



select * from test1 where owner='SCOTT' or object_id in(select object_id from test2 where owner='SCOTT');



1859 rows selected.





Execution Plan

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

Plan hash value: 4136318878



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

| Id  | Operation			 | Name  | Rows  | Bytes | Cost (%CPU)| Time	 |

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

|   0 | SELECT STATEMENT		 |	 |  5493 |   520K|   296   (1)| 00:00:04 |

|*  1 |  FILTER 			 |	 |	 |	 |	      | 	 |

|   2 |   TABLE ACCESS FULL		 | TEST1 | 74533 |  7060K|   296   (1)| 00:00:04 |

|   3 |   BITMAP CONVERSION TO ROWIDS	 |	 |     1 |    19 |     2   (0)| 00:00:01 |

|   4 |    BITMAP AND			 |	 |	 |	 |	      | 	 |

|   5 |     BITMAP CONVERSION FROM ROWIDS|	 |	 |	 |	      | 	 |

|*  6 |      INDEX RANGE SCAN		 | IDX3  |  1860 |	 |     1   (0)| 00:00:01 |

|   7 |     BITMAP CONVERSION FROM ROWIDS|	 |	 |	 |	      | 	 |

|*  8 |      INDEX RANGE SCAN		 | IDX4  |  1860 |	 |     1   (0)| 00:00:01 |

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



Predicate Information (identified by operation id):

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



   1 - filter("OWNER"='SCOTT' OR  EXISTS (SELECT 0 FROM "TEST2" "TEST2" WHERE

	      "OBJECT_ID"=:B1 AND "OWNER"='SCOTT'))

   6 - access("OBJECT_ID"=:B1)

   8 - access("OWNER"='SCOTT')





Statistics

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

	  1  recursive calls

	  0  db block gets

     475201  consistent gets

	  0  physical reads

	  0  redo size

      70860  bytes sent via SQL*Net to client

       1772  bytes received via SQL*Net from client

	125  SQL*Net roundtrips to/from client

	  0  sorts (memory)

	  0  sorts (disk)

       1859  rows processed





由于在test2上创建的都是单列索引:

create index idx3 on test2(object_id);

create index idx4 on test2(owner);





在test2上创建组合索引

create index idx5 on test2(object_id,owner);



SQL> select * from test1 where owner='SCOTT' or object_id in(select object_id from test2 where owner='SCOTT');



1859 rows selected.





Execution Plan

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

Plan hash value: 4133849820



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

| Id  | Operation		     | Name  | Rows  | Bytes | Cost (%CPU)| Time     |

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

|   0 | SELECT STATEMENT	     |	     |	5493 |	 520K|	 296   (1)| 00:00:04 |

|*  1 |  FILTER 		     |	     |	     |	     |		  |	     |

|   2 |   TABLE ACCESS FULL	     | TEST1 | 74533 |	7060K|	 296   (1)| 00:00:04 |

|*  3 |   TABLE ACCESS BY INDEX ROWID| TEST2 |	   1 |	  19 |	   4   (0)| 00:00:01 |

|*  4 |    INDEX RANGE SCAN	     | IDX4  |	1860 |	     |	   1   (0)| 00:00:01 |

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



Predicate Information (identified by operation id):

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



   1 - filter("OWNER"='SCOTT' OR  EXISTS (SELECT 0 FROM "TEST2" "TEST2" WHERE

	      "OWNER"='SCOTT' AND "OBJECT_ID"=:B1))

   3 - filter("OBJECT_ID"=:B1)

   4 - access("OWNER"='SCOTT')





Statistics

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

	  1  recursive calls

	  0  db block gets

    2399432  consistent gets

	  0  physical reads

	  0  redo size

      70860  bytes sent via SQL*Net to client

       1772  bytes received via SQL*Net from client

	125  SQL*Net roundtrips to/from client

	  0  sorts (memory)

	  0  sorts (disk)

       1859  rows processed


 

你可能感兴趣的:(conversion)