oracle sql 索引优化一例

需要sql语句:

 SELECT *
     FROM cux.CUX_SETT_XLA_LINES V
    WHERE V.SOURCE_CODE = 'STR'
    AND v.created_by = 0
    AND v.accounting_date =DATE '2017-10-25'
      ORDER BY V.CREATION_DATE DESC;
Plan hash value: 2341381659

-------------------------------------------------------------------------------------------------
| Id  | Operation          | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |                    |  4826 |   975K|       |  1053K  (2)| 03:30:46 |
|   1 |  SORT ORDER BY     |                    |  4826 |   975K|  1624K|  1053K  (2)| 03:30:46 |
|*  2 |   TABLE ACCESS FULL| CUX_SETT_XLA_LINES |  4826 |   975K|       |  1053K  (2)| 03:30:43 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("V"."ACCOUNTING_DATE"=TO_DATE(' 2017-10-25 00:00:00', 'syyyy-mm-dd 
              hh24:mi:ss') AND "V"."CREATED_BY"=0 AND "V"."SOURCE_CODE"='STR')

看下每个列的重复值情况

select count(distinct SOURCE_CODE) from  cux.CUX_SETT_XLA_LINES -- 9

select count(distinct created_by) from  cux.CUX_SETT_XLA_LINES -- 13

这两列是数据是明显缺少位图索引的列。且这张表主要用于查询

那么位图索引是显然的选择了

SQL> create bitmap index i_x_sc on CUX_SETT_XLA_LINES(SOURCE_CODE)
  2  /

Index created.


SQL> analyze index i_x_sc
  2  validate  structure
  3  /

Index analyzed.


SQL> show user
USER is "CUX"
SQL> create bitmap index inx_create on CUX_SETT_XLA_LINES(created_by)
  2  /

Index created.

上述位图索引建好后,大小在30M以下

普通列建B树索引

SQL> create index inx_accdate on CUX_SETT_XLA_LINES (accounting_date);

Index created.

该索引建好后大小为:
2.36 GB
B树索引还是占空间的

优化后的sql执行计划

Plan hash value: 1948297352

----------------------------------------------------------------------------------------------------------------
| Id  | Operation                         | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                  |                    |  4826 |   975K|       |  3536   (1)| 00:00:43 |
|   1 |  SORT ORDER BY                    |                    |  4826 |   975K|  1624K|  3536   (1)| 00:00:43 |
|   2 |   TABLE ACCESS BY INDEX ROWID     | CUX_SETT_XLA_LINES |  4826 |   975K|       |  3315   (1)| 00:00:40 |
|   3 |    BITMAP CONVERSION TO ROWIDS    |                    |       |       |       |            |          |
|   4 |     BITMAP AND                    |                    |       |       |       |            |          |
|*  5 |      BITMAP INDEX SINGLE VALUE    | INX_CREATE         |       |       |       |            |          |
|*  6 |      BITMAP INDEX SINGLE VALUE    | I_X_SC             |       |       |       |            |          |
|   7 |      BITMAP CONVERSION FROM ROWIDS|                    |       |       |       |            |          |
|*  8 |       INDEX RANGE SCAN            | INX_ACCDATE        |   579K|       |       |  1555   (1)| 00:00:19 |
----------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   5 - access("V"."CREATED_BY"=0)
   6 - access("V"."SOURCE_CODE"='STR')
   8 - access("V"."ACCOUNTING_DATE"=TO_DATE(' 2017-10-25 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

实际观察一下,将一条一个小时跑不出来的sql优化到300ms,提示何止1000倍呢。我们用很小的空间代价,换来极大的性能提升。

不过这只是oracle sql优化一个很简单的例子

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值