组合索引位置的使用测试
1 内容
本文档记录组合索引的顺序跟相应组合索引的顺序的测试结果,目的是如何在实际的工作中如何有效的使用组合索引;
1.1 测试环境
数据库版本:oracle 11.0.2.3
表:BKPF
索引:BKPF~1
测试语句:
SELECT /*+ INDEX(BKPF "BKPF~1") */
BELNR XM_BELNR, BUDAT XM_BUDAT, BUKRS XM_BUKRS, GJAHR XM_GJAHR,XBLNR GF_VBELN
FROM SAPSR3.BKPF
WHERE XBLNR IN ('20120701001','0090000449','20120701001','0090000482','0090000484' ) AND MANDT='210' AND BLART IN ('WL','SA' );
1.2 测试前思考
索引BKPF~1的列MANDT只有一个唯一值,弱选择性;
列XBLNR有1886列,具有很强的选择性;
目前XBLNR列在组合索引的最后一个位置,按照索引的组成原理,强选择性的列位于组合索引的前面位置,应该有更好的性能;
2 测试的步骤
a) 原有索引BKPF~1,各项的位置如下:MANDT、BSTAT、BUKRS、XBLNR,查看执行计划;
b) 重建索引BKPF~1,各项的位置如下:XBLNR、MANDT、BSTAT、BUKRS,查看执行计划;
2.1 原有的索引上执行sql语句
Execution Plan
----------------------------------------------------------
Plan hash value: 3435912789
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 172 | 113 (1)| 00:00:02 |
|* 1 | TABLE ACCESS BY INDEX ROWID| BKPF | 4 | 172 | 113 (1)| 00:00:02 |
|* 2 | INDEX RANGE SCAN | BKPF~1 | 51 | | 97 (2)| 00:00:02 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("BLART"='SA' OR "BLART"='WL')
2 - access("MANDT"='210')
filter("XBLNR"='0090000449' OR "XBLNR"='0090000482' OR
"XBLNR"='0090000484' OR "XBLNR"='20120701001')
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
141 consistent gets
95 physical reads
0 redo size
2093 bytes sent via SQL*Net to client
541 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
42 rows processed
说明:
1、选择索引的条件是MANDT,然后对索引进行过滤操作;
2、预计运行时间是2s(这个时间经过四舍五入的操作,最低1s,不是很准确)
3、该操作有141个一致读;
2.2 重建后的索引执行SQL语句
Execution Plan
Plan hash value: 3225880221
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 4 | 172 | 20 (0)| 00:00:01 |
| 1 | INLIST ITERATOR | | | | | |
|* 2 | TABLE ACCESS BY INDEX ROWID| BKPF | 4 | 172 | 20 (0)| 00:00:01 |
|* 3 | INDEX RANGE SCAN | BKPF~1 | 51 | | 5 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
2 - filter(("BLART"='SA' OR "BLART"='WL') AND "MANDT"='210')
3 - access("XBLNR"='0090000449' OR "XBLNR"='0090000482' OR
"XBLNR"='0090000484' OR "XBLNR"='20120701001')
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
53 consistent gets
0 physical reads
0 redo size
2093 bytes sent via SQL*Net to client
541 bytes received via SQL*Net from client
4 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
42 rows processed
说明:
1、选择索引的条件是XBLNR,然后对索引进行过滤操作;
2、预计运行时间是1s;
3、 该操作有53个一致读;
3 总结
a) 组合索引的创建:在特定的情况下开发会对经常使用的sql语句的条件创建索引,如果这些条件会经常一起出现,那么这些条件创建一个组合索引可以得到很好的性能;
b) 其他的sql语句也有可能会用到这个索引,这个时候如果把强选择性的列放在索引的前端,那么可以得到更好的性能;
转自:组合索引位置的使用测试