组合索引位置的使用测试

组合索引位置的使用测试

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语句也有可能会用到这个索引,这个时候如果把强选择性的列放在索引的前端,那么可以得到更好的性能;

转自:组合索引位置的使用测试

猜你喜欢

转载自blog.csdn.net/sunbocong/article/details/80284119