dreamhua 2020-05-08
组合索引与排序
步骤一 构造测试表
drop table TX1 purge; create table TX1 as select * from dba_objects; create index idx_object_id on TX1(owner,object_type); alter table TX1 modify owner not NULL; exec dbms_stats.gather_table_stats(‘SYS‘,‘TX1‘,cascade=>true);
测试一,索引无排序
SQL> set autotrace traceonly
SQL> select /*+index(TX1,idx_object_id)*/ * from TX1 order by owner desc ,object_type asc;
73396 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 509348553
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 73396 | 9461K| | 5932 (1)| 00:00:01 |
| 1 | SORT ORDER BY | | 73396 | 9461K| 13M| 5932 (1)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| TX1 | 73396 | 9461K| | 3627 (1)| 00:00:01 |
| 3 | INDEX FULL SCAN | IDX_OBJECT_ID | 73396 | | | 259 (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
60 recursive calls
0 db block gets
3726 consistent gets
0 physical reads
0 redo size
4637967 bytes sent via SQL*Net to client
54269 bytes received via SQL*Net from client
4895 SQL*Net roundtrips to/from client
5 sorts (memory)
0 sorts (disk)
73396 rows processed发现有许多内存排序
测试二,索引无有排序
drop index idx_object_id;
create index idx_object_id on TX1(owner desc ,object_type asc);
select /*+index(TX1,idx_object_id)*/ * from TX1 order by owner desc ,object_type asc;
Execution Plan
----------------------------------------------------------
Plan hash value: 3824983714
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 73396 | 9461K| 3638 (1)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TX1 | 73396 | 9461K| 3638 (1)| 00:00:01 |
| 2 | INDEX FULL SCAN | IDX_OBJECT_ID | 73396 | | 270 (1)| 00:00:01 |
---------------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
13190 consistent gets
268 physical reads
0 redo size
4610085 bytes sent via SQL*Net to client
54269 bytes received via SQL*Net from client
4895 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
73396 rows processed测试结果,发现内存排序没有了,cost降低了不少
测试三,索引排序反转
select /*+index(TX1,idx_object_id)*/ * from TX1 order by owner asc ,object_type desc;
SQL> select /*+index(TX1,idx_object_id)*/ * from TX1 order by owner asc ,object_type desc;
73396 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 509348553
--------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 73396 | 9461K| | 5943 (1)| 00:00:01 |
| 1 | SORT ORDER BY | | 73396 | 9461K| 13M| 5943 (1)| 00:00:01 |
| 2 | TABLE ACCESS BY INDEX ROWID BATCHED| TX1 | 73396 | 9461K| | 3638 (1)| 00:00:01 |
| 3 | INDEX FULL SCAN | IDX_OBJECT_ID | 73396 | | | 270 (1)| 00:00:01 |
--------------------------------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
3634 consistent gets
0 physical reads
0 redo size
4637361 bytes sent via SQL*Net to client
54269 bytes received via SQL*Net from client
4895 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
73396 rows processed发现有内存排序,cost 还是很高
测试四,加hit 索引反转
SQL> select /*+index_desc(TX1,idx_object_id)*/ * from TX1 order by owner asc ,object_type desc;
73396 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1887026249
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 73396 | 9461K| 3638 (1)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TX1 | 73396 | 9461K| 3638 (1)| 00:00:01 |
| 2 | INDEX FULL SCAN DESCENDING| IDX_OBJECT_ID | 73396 | | 270 (1)| 00:00:01 |
---------------------------------------------------------------------------------------------
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
13182 consistent gets
0 physical reads
0 redo size
4610122 bytes sent via SQL*Net to client
54274 bytes received via SQL*Net from client
4895 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
73396 rows processed测试结果,发现没有内存排序,COST提高不少
总结,索引排序提高效率,可以在应用中使用