here条件中不带分区列,但是使用不含分区列的LOCAL-NON_PREFIXED索引
SQL> select /*+ index(t li_idx_03)*/ * from tivoli.li_db_session_t t where t.allsess=28 and t.dbname='COSTDB' and t.activess=4;
--上面语句,where条件中不含表的分区列
2346 rows selected.
Execution Plan
----------------------------------------------------------
Plan hash value: 1367932018
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 136 | 2720 | 134 (0)| 00:00:02 | | |
| 1 | PARTITION RANGE ALL | | 136 | 2720 | 134 (0)| 00:00:02 | 1 | 20 |
| 2 | TABLE ACCESS BY LOCAL INDEX ROWID| LI_DB_SESSION_T | 136 | 2720 | 134 (0)| 00:00:02 | 1 | 20 |
|* 3 | INDEX RANGE SCAN | LI_IDX_03 | 136 | | 41 (0)| 00:00:01 | 1 | 20 |
----------------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("T"."DBNAME"='COSTDB' AND "T"."ALLSESS"=28 AND "T"."ACTIVESS"=4)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
1869 consistent gets
1046 physical reads
0 redo size
59842 bytes sent via SQL*Net to client
2239 bytes received via SQL*Net from client
158 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
2346 rows processed
5、性能对比小结
5.1 五种索引性能对比
(1)SQL语句:
select * from tivoli.li_db_session_t t where t.allsess=28 andt.dbname='COSTDB' and t.timstap >to_date('2011-01-01','yyyy-mm-dd') andt.timstap < to_date('2011-01-20','yyyy-mm-dd') and t.activess=4;
| 序号 |
使用索引名称 |
索引特点 |
索引类型 |
是否有回表 |
time |
consistent gets |
| 1 |
LI_IDX_01 |
只有分区字段列的local索引 |
LOCAL-PREFIXED |
是 |
0:41:38 |
262334 |
| 2 |
LI_IDX_02 |
分区字段列为索引首位,索引中的列包含where条件中的所有列的local索引 |
LOCAL-PREFIXED |
否 |
0:00:34 |
3141 |
| 3 |
LI_IDX_03 |
不包含分区字段列的local索引,索引字段包含where条件中除分区列以外的所有列 |
LOCAL-NON_PREFIXED |
是 |
0:00:02 |
658 |
| 4 |
LI_IDX_04 |
包含where条件中的所有列,包括分区字段列,但是分区字段列非首位的local索引 |
LOCAL-NON_PREFIXED |
否 |
0:00:01 |
43 |
| 5 |
LI_IDX_05 |
包含where条件中的所有列,包括分区字段列,但是分区字段列非首位的全局索引 |
GLOBAL |
否 |
0:00:01 |
41 |
(2)SQL语句二:
select /*+ index(t li_idx_03)*/ * fromtivoli.li_db_session_t t where t.allsess=28 and t.dbname='COSTDB' andt.activess=4;
| 序号 |
使用索引名称 |
索引特点 |
索引类型 |
是否有回表 |
time |
consistent gets |
| 1 |
LI_IDX_03 |
不包含分区字段列的local索引,索引字段包含where条件中除分区列以外的所有列 |
LOCAL-NON_PREFIXED |
是 |
0:00:02 |
1869 |
5.2 小结
(1)从上面性能对比数据来看,GLOBAL索引的性能最好,但是由于GLOBAL索引在删除分区后索引会失效,所以分区表上不建议使用GLOBAL索引。
(2)关于LOCAL-PREFIXED与LOCAL-NON_PREFIXED索引:如果查询条件包含索引的所有列,LOCAL-NON_PREFIXED索引索引性能优化于LOCAL-PREFIXED索引,只包含分区字段列的LOCAL-PREFIXED索引性能最差
(3)不包含分区字段列的LOCAL-NON_PREFIXED索引(如LI_IDX_03),一定是要在where条件中带有分区字段列做为条件的情况下,效果才会理想,如果where条件中不包含分区字段列,就不应该使用LOCAL索引,全局索引的效果会远远优于不包含分区字段列的LOCAL-NON_PREFIXED索引