分页SQL创建索引规则

来源:互联网 发布:全球高清网络电视直播 编辑:程序博客网 时间:2024/06/02 05:28
SQL>  select * from dba_indexes where table_name='T100' and owner='SYSTEM';SQL> 未选定行SQL> select *  from (select rownum as rn, a.*          from (select *                  from t100 a                 where object_id > 1500                   and owner = 'SYSTEM'                 order by object_id desc) a         where rownum <= 40) a where rn >= 1;SQL>  select count(*) from t100 where owner='SYSTEM';  COUNT(*)----------     79232SQL>  select count(*) from t100 where owner='SYSTEM' and object_id>1500;  COUNT(*)----------     71552---高级执行计划:11G:set linesize 200;set pagesize 200;alter session set statistics_level=all; ---再运行SQLSQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID89y7dnv0suzyt, child number 0-------------------------------------select *   from (select rownum as rn, a.*    from (select *     from t100 a  where object_id > 1500    and owner = 'SYSTEM'  order by object_iddesc) a  where rownum <= 40) awhere rn >= 1Plan hash value: 3078193190-------------------------------------------------------------------------------------------------------------------------------| Id  | Operation | Name | Starts | E-Rows | A-Rows |   A-Time| Buffers | Reads  |  OMem |  1Mem | Used-Mem |-------------------------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT ||      1 |  |40 |00:00:00.73 |     171K|    171K|   |   |      ||*  1 |  VIEW ||      1 |     40 |40 |00:00:00.73 |     171K|    171K|   |   |      ||*  2 |   COUNT STOPKEY  ||      1 |  |40 |00:00:00.73 |     171K|    171K|   |   |      ||   3 |    VIEW  ||      1 |    425K|40 |00:00:00.73 |     171K|    171K|   |   |      ||*  4 |     SORT ORDER BY STOPKEY||      1 |    425K|40 |00:00:00.73 |     171K|    171K| 61440 | 61440 |55296  (0)||*  5 |      TABLE ACCESS FULL | T100 |      1 |    425K|  71552 |00:00:00.70 |     171K|    171K|   |   |      |-------------------------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   4 - filter(ROWNUM<=40)   5 - filter(("OWNER"='SYSTEM' AND "OBJECT_ID">1500))已选择28行。在object_id列上创建索引;SQL> create index t100_idx1 on t100(object_id);索引已创建。返回只有40条,但是这个SQL需要访问71552 条记录 显然不够优化创建索引:SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID89y7dnv0suzyt, child number 0-------------------------------------select *   from (select rownum as rn, a.*    from (select *     from t100 a  where object_id > 1500    and owner = 'SYSTEM'  order by object_iddesc) a  where rownum <= 40) awhere rn >= 1Plan hash value: 2240177993----------------------------------------------------------------------------------------------------------------| Id  | Operation| Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |----------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT|    |   1 |      |     40 |00:00:00.01 |   46 |      2 ||*  1 |  VIEW|    |   1 |   40 |     40 |00:00:00.01 |   46 |      2 ||*  2 |   COUNT STOPKEY |    |   1 |      |     40 |00:00:00.01 |   46 |      2 ||   3 |    VIEW |    |   1 |   41 |     40 |00:00:00.01 |   46 |      2 ||*  4 |     TABLE ACCESS BY INDEX ROWID | T100    |   1 |  425K|     40 |00:00:00.01 |   46 |      2 ||*  5 |      INDEX RANGE SCAN DESCENDING| T100_IDX1 |   1 | 1149 |     40 |00:00:00.01 |    6 |      2 |----------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   4 - filter("OWNER"='SYSTEM')   5 - access("OBJECT_ID">1500)已选择28行。这时候就只访问了40条.继续优化:SQL>  create index t100_idx2 on t100(owner,object_id);索引已创建。SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID89y7dnv0suzyt, child number 0-------------------------------------select *   from (select rownum as rn, a.*    from (select *     from t100 a  where object_id > 1500    and owner = 'SYSTEM'  order by object_iddesc) a  where rownum <= 40) awhere rn >= 1Plan hash value: 2326092562----------------------------------------------------------------------------------------------------------------| Id  | Operation| Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |----------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT|    |   1 |      |     40 |00:00:00.01 |   46 |      2 ||*  1 |  VIEW|    |   1 |   40 |     40 |00:00:00.01 |   46 |      2 ||*  2 |   COUNT STOPKEY |    |   1 |      |     40 |00:00:00.01 |   46 |      2 ||   3 |    VIEW |    |   1 |   41 |     40 |00:00:00.01 |   46 |      2 ||   4 |     TABLE ACCESS BY INDEX ROWID | T100    |   1 |  425K|     40 |00:00:00.01 |   46 |      2 ||*  5 |      INDEX RANGE SCAN DESCENDING| T100_IDX2 |   1 |   41 |     40 |00:00:00.01 |    6 |      2 |----------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   5 - access("OWNER"='SYSTEM' AND "OBJECT_ID" IS NOT NULL AND "OBJECT_ID">1500)已选择27行。继续测试:SQL>  select count(*) from t100 where owner='SYSTEM';  COUNT(*)----------     79232SQL>  create index t100_idx2 on t100(owner,object_id);select count(*)                  from t100 a                 where                  owner = 'SYSTEM'                 and object_name like '%LOG%'select *  from (select rownum as rn, a.*          from (select *                  from t100 a                 where                     owner = 'SYSTEM'                    and object_name like '%LOG%'                 order by object_id desc) a         where rownum <= 40) a where rn >= 1SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID5yc23rv5p3151, child number 1-------------------------------------select *   from (select rownum as rn, a.*    from (select *     from t100 a  whereowner = 'SYSTEM'     and object_name like '%LOG%'   order by object_id desc) a       where rownum <= 40) awhere rn >= 1Plan hash value: 2326092562----------------------------------------------------------------------------------------------------------------| Id  | Operation| Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |----------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT|    |   1 |      |     40 |00:00:00.01 | 1715 |      3 ||*  1 |  VIEW|    |   1 |   40 |     40 |00:00:00.01 | 1715 |      3 ||*  2 |   COUNT STOPKEY |    |   1 |      |     40 |00:00:00.01 | 1715 |      3 ||   3 |    VIEW |    |   1 |   40 |     40 |00:00:00.01 | 1715 |      3 ||*  4 |     TABLE ACCESS BY INDEX ROWID | T100    |   1 |21578 |     40 |00:00:00.01 | 1715 |      3 ||*  5 |      INDEX RANGE SCAN DESCENDING| T100_IDX2 |   1 |  800 |   1704 |00:00:00.01 |   11 |      0 |----------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   4 - filter(("OBJECT_NAME" LIKE '%LOG%' AND "OBJECT_NAME" IS NOT NULL))   5 - access("OWNER"='SYSTEM')已选择29行。创建索引:SQL> create index t100_idx3 on t100(owner,object_name,object_id);SQL> select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID5jj00atgztb53, child number 0-------------------------------------select *   from (select rownum as rn, a.*    from (select *     from t100 a  whereowner = 'SYSTEM'     and object_name like '%LOG%'   order by object_id desc) a       where rownum <= 40) awhere rn >= 1Plan hash value: 3429328390-------------------------------------------------------------------------------------------------------------------------------------------| Id  | Operation| Name    | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |  OMem |  1Mem | Used-Mem |-------------------------------------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT|    |   1 |      |     40 |00:00:00.13 |39633 |    918 |       |       |  ||*  1 |  VIEW|    |   1 |   40 |     40 |00:00:00.13 |39633 |    918 |       |       |  ||*  2 |   COUNT STOPKEY |    |   1 |      |     40 |00:00:00.13 |39633 |    918 |       |       |  ||   3 |    VIEW |    |   1 |21578 |     40 |00:00:00.13 |39633 |    918 |       |       |  ||*  4 |     SORT ORDER BY STOPKEY|    |   1 |21578 |     40 |00:00:00.13 |39633 |    918 | 24576 | 24576 |22528  (0)||   5 |      TABLE ACCESS BY INDEX ROWID| T100    |   1 |21578 |  39168 |00:00:00.11 |39633 |    918 |       |       |  ||*  6 |       INDEX RANGE SCAN| T100_IDX3 |   1 |21578 |  39168 |00:00:00.04 |  465 |    464 |       |       |  |-------------------------------------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   4 - filter(ROWNUM<=40)   6 - access("OWNER"='SYSTEM')       filter(("OBJECT_NAME" LIKE '%LOG%' AND "OBJECT_NAME" IS NOT NULL))已选择31行。创建索引:SQL>  create index t100_idx4 on t100(object_id,owner,object_name);索引已创建。SQL>  select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));PLAN_TABLE_OUTPUT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL_ID5jj00atgztb53, child number 0-------------------------------------select *   from (select rownum as rn, a.*    from (select *     from t100 a  whereowner = 'SYSTEM'     and object_name like '%LOG%'   order by object_id desc) a       where rownum <= 40) awhere rn >= 1Plan hash value: 1439634448---------------------------------------------------------------------------------------------------------------| Id  | Operation       | Name   | Starts | E-Rows | A-Rows |   A-Time   | Buffers | Reads  |---------------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT       |   |  1 |     |   40 |00:00:01.75 |   68683 |68639 ||*  1 |  VIEW       |   |  1 |  40 |   40 |00:00:01.75 |   68683 |68639 ||*  2 |   COUNT STOPKEY        |   |  1 |     |   40 |00:00:01.75 |   68683 |68639 ||   3 |    VIEW        |   |  1 |  40 |   40 |00:00:01.75 |   68683 |68639 ||   4 |     TABLE ACCESS BY INDEX ROWID| T100   |  1 |  21578 |   40 |00:00:01.75 |   68683 |68639 ||*  5 |      INDEX FULL SCAN DESCENDING| T100_IDX4 |  1 |  40 |   40 |00:00:01.75 |   68643 |68639 |---------------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   5 - access("OWNER"='SYSTEM')       filter(("OWNER"='SYSTEM' AND "OBJECT_NAME" LIKE '%LOG%' AND "OBJECT_NAME" IS NOT NULL))已选择29行。对比:走 T100_IDX4 索引, create index t100_idx4 on t100(object_id,owner,object_name);执行计划----------------------------------------------------------Plan hash value: 1439634448--------------------------------------------------------------------------------------------| Id  | Operation       | Name   | Rows  | Bytes | Cost (%CPU)| Time   |--------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT       |   |40 |  8800 |   189   (0)| 00:00:03 ||*  1 |  VIEW       |   |40 |  8800 |   189   (0)| 00:00:03 ||*  2 |   COUNT STOPKEY        |   |   |   ||   ||   3 |    VIEW        |   |40 |  8280 |   189   (0)| 00:00:03 ||   4 |     TABLE ACCESS BY INDEX ROWID| T100   | 21578 |  2044K|   189   (0)| 00:00:03 ||*  5 |      INDEX FULL SCAN DESCENDING| T100_IDX4 |40 |   |   148   (0)| 00:00:02 |--------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   5 - access("OWNER"='SYSTEM')       filter("OWNER"='SYSTEM' AND "OBJECT_NAME" LIKE '%LOG%' AND "OBJECT_NAME" IS      NOT NULL)统计信息----------------------------------------------------------  1  recursive calls  0  db block gets      68683  consistent gets  0  physical reads  0  redo size       2543  bytes sent via SQL*Net to client541  bytes received via SQL*Net from client  4  SQL*Net roundtrips to/from client  0  sorts (memory)  0  sorts (disk) 40  rows processed此时逻辑读为   68683走 index t100_idx2 SQL> create index t100_idx2 on t100(owner,object_id)SQL> select *  from (select rownum as rn, a.*          from (select *                  from t100 a                 where                     owner = 'SYSTEM'                    and object_name like '%LOG%'                 order by object_id desc) a         where rownum <= 40) a where rn >= 1  2    3    4    5    6    7    8    9   10  ;已选择40行。执行计划----------------------------------------------------------Plan hash value: 2326092562---------------------------------------------------------------------------------------------| Id  | Operation| Name    | Rows  | Bytes | Cost (%CPU)| Time     |---------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT|    | 40 |  8800 |806   (0)| 00:00:10 ||*  1 |  VIEW|    | 40 |  8800 |806   (0)| 00:00:10 ||*  2 |   COUNT STOPKEY |    |    |    | |    ||   3 |    VIEW |    | 40 |  8280 |806   (0)| 00:00:10 ||*  4 |     TABLE ACCESS BY INDEX ROWID | T100    | 21578 |  2044K|806   (0)| 00:00:10 ||*  5 |      INDEX RANGE SCAN DESCENDING| T100_IDX2 |800 |    |  5   (0)| 00:00:01 |---------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   4 - filter("OBJECT_NAME" LIKE '%LOG%' AND "OBJECT_NAME" IS NOT NULL)   5 - access("OWNER"='SYSTEM')统计信息---------------------------------------------------------- 43  recursive calls  0  db block gets       1752  consistent gets  0  physical reads  0  redo size       2543  bytes sent via SQL*Net to client541  bytes received via SQL*Net from client  4  SQL*Net roundtrips to/from client  6  sorts (memory)  0  sorts (disk) 40  rows processed此时逻辑读为1752SQL> create index t100_idx4 on t100(owner,object_name,object_id);SQL> select count(*) from t100;  COUNT(*)----------  12083584SQL> select count(*) from t100 where owner='SYSTEM';  COUNT(*)----------     79232SQL> select count(*) from t100 where owner='SYSTEM'  and object_name like '%LOG%';  COUNT(*)----------     39168SQL> create index t100_idx4 on t100(owner,object_name,object_id);执行计划----------------------------------------------------------Plan hash value: 3541489740-----------------------------------------------------------------------------------------------------| Id  | Operation| Name    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |-----------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT|    | 40 |  8800 |    | 24854   (1)| 00:04:59 ||*  1 |  VIEW|    | 40 |  8800 |    | 24854   (1)| 00:04:59 ||*  2 |   COUNT STOPKEY |    |    |    |    | |    ||   3 |    VIEW |    | 21578 |  4361K|    | 24854   (1)| 00:04:59 ||*  4 |     SORT ORDER BY STOPKEY|    | 21578 |  2044K|  2840K| 24854   (1)| 00:04:59 ||   5 |      TABLE ACCESS BY INDEX ROWID| T100    | 21578 |  2044K|    | 24372   (1)| 00:04:53 ||*  6 |       INDEX RANGE SCAN| T100_IDX4 | 21578 |    |    |  2790   (1)| 00:00:34 |-----------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("RN">=1)   2 - filter(ROWNUM<=40)   4 - filter(ROWNUM<=40)   6 - access("OWNER"='SYSTEM')       filter("OBJECT_NAME" LIKE '%LOG%' AND "OBJECT_NAME" IS NOT NULL)统计信息---------------------------------------------------------- 31  recursive calls  0  db block gets      39665  consistent gets124  physical reads  0  redo size       2543  bytes sent via SQL*Net to client541  bytes received via SQL*Net from client  4  SQL*Net roundtrips to/from client  7  sorts (memory)  0  sorts (disk) 40  rows processed分页创建索引,where条件列加order by列  where 条件列为能过滤掉大量数据的列


                                             
0 0