SQL优化消除bitmap 提速 近20倍

现场人员反馈 某模块响应执行sql缓慢 要跑17s,客户无法忍受,协助帮忙看下

select 发票序号i,
       (case
         when 发票序号i is null then
          '合计'
         when 发票序号 is null then
          '小计'
         else
          to_char(发票序号)
       end) as 发票序号,
       发票顺序,
       收费项目序号i,
       收费项目序号,
       规格说明,
       数量,
       计量单位,
       执行单价,
       sum(执行金额) as 执行金额,
       医保类别,
       农合类别,
       套外否,
       处方序号I
  from (select 发票序号i,
               发票序号,
               发票顺序,
               收费项目序号i,
               收费项目序号,
               规格说明,
               sum(数量) as 数量,
               计量单位,
               执行单价,
               sum(执行金额) as 执行金额,
               医保类别,
               农合类别,
               套外否,
               处方序号I
          From (select nvl(发票序号i, 0) as 发票序号i,
                       nvl(发票序号, '未设置') as 发票序号,
                       发票顺序,
                       收费项目序号i,
                       收费项目序号,
                       规格说明,
                       数量,
                       计量单位,
                       执行单价,
                       执行金额,
                       医保类别,
                       农合类别,
                       套外否,
                       0 As 处方序号I
                  from inq_vd住院费用明细_发票
                 Where 住院序号i = '418'
                   And 处方序号i = 0
                   And 结算序号i = 0
                   And 婴儿序号I = 0
                   And 开单科室I = '31'
                   and 记账时间 between
                       to_date('2019-03-04 13:43', 'yyyy-MM-dd HH24:mi:ss') and
                       to_date('2019-03-06 23:59', 'yyyy-MM-dd HH24:mi:ss')
                Union All
                select nvl(发票序号i, 0) as 发票序号i,
                       nvl(发票序号, '未设置') as 发票序号,
                       发票顺序,
                       收费项目序号i,
                       收费项目序号,
                       规格说明,
                       数量,
                       计量单位,
                       执行单价,
                       执行金额,
                       医保类别,
                       农合类别,
                       套外否,
                       1 As 处方序号I
                  from INQ_VD住院费用明细_处方明细
                 Where 住院序号i = '418'
                   And 结算序号i = 0
                   And 婴儿序号I = 0
                   And 开单科室I = '31'
                   and 记账时间 between
                       to_date('2019-03-04 13:43', 'yyyy-MM-dd HH24:mi:ss') and
                       to_date('2019-03-06 23:59', 'yyyy-MM-dd HH24:mi:ss')) A
         group by 发票序号i,
                  发票序号,
                  发票顺序,
                  收费项目序号i,
                  收费项目序号,
                  规格说明,
                  计量单位,
                  执行单价,
                  医保类别,
                  农合类别,
                  套外否,
                  处方序号I) A
 where A.数量 <> 0
 group by grouping sets((发票序号i, 发票序号, 发票顺序, 收费项目序号i, 收费项目序号, 规格说明, 数量, 计量单位, 执行单价, 医保类别, 农合类别, 套外否, 处方序号I), A.发票序号I,())
 Order By 发票序号I, 发票顺序;
分析两个 union 都是秒出 ,那么定位在group 上导致 ,分析执行计划

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Plan hash value: 1640705745

--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT   | |1 | 639 | 9 (23)| 00:00:01 |
| 1 | SORT ORDER BY      | |1 | 639 | 9 (23)| 00:00:01 |
| 2 | SORT GROUP BY ROLLUP | |1 | 639 | 9 (23)| 00:00:01 |
| 3 | VIEW               | |1 | 639 | 8 (13)| 00:00:01 |
|* 4| FILTER | || | | |
| 5 | HASH GROUP BY | |1 | 639 | 8 (13)| 00:00:01 |
| 6 | VIEW | |2 | 1278 | 7 (0)| 00:00:01 |
| 7 | UNION-ALL | || | | |
|* 8 | FILTER | || | | |
| 9 | NESTED LOOPS | || | | |
| 10 | NESTED LOOPS | |1 | 156 | 5 (0)| 00:00:01 |
| 11 | NESTED LOOPS | |1 | 122 | 4 (0)| 00:00:01 |
| 12 | NESTED LOOPS OUTER | |1 | 113 | 3 (0)| 00:00:01 |
|* 13 | TABLE ACCESS BY INDEX ROWID | INQ_D住院费用明细 |1 | 99 | 2 (0)| 00:00:01 |
|* 14 | INDEX RANGE SCAN | IDX_120675_住院序 |
1 | | 1 (0)| 00:00:01 |
| 15 | TABLE ACCESS BY INDEX ROWID | DOC_T发票项目 |
1 | 14 | 1 (0)| 00:00:01 |
|* 16 | INDEX UNIQUE SCAN | PK_T发票项目 |
1 | | 0 (0)| 00:00:01 |
|* 17 | TABLE ACCESS BY INDEX ROWID | INQ_D住院费用列表 |
1 | 9 | 1 (0)| 00:00:01 |
|* 18 | INDEX UNIQUE SCAN | PK_INQ_D住院费用列|
1 | | 0 (0)| 00:00:01 |
|* 19 | INDEX UNIQUE SCAN | PK_T收费项目价格表|
1 | | 0 (0)| 00:00:01 |
| 20 | TABLE ACCESS BY INDEX ROWID | DOC_T收费项目价格 |
1 | 34 | 1 (0)| 00:00:01 |
|* 21 | FILTER | |
| | | |
| 22 | NESTED LOOPS | |
| | | |
| 23 | NESTED LOOPS | |
1 | 2316 | 2 (0)| 00:00:01 |
| 24 | NESTED LOOPS OUTER | |
1 | 2306 | 1 (0)| 00:00:01 |
| 25 | NESTED LOOPS | |
1 | 2292 | 0 (0)| 00:00:01 |
| 26 | NESTED LOOPS | |
1 | 2285 | 0 (0)| 00:00:01 |
| 27 | VIEW | |
1 | 2239 | 0 (0)| 00:00:01 |
| 28 | UNION-ALL | |
| | | |
| 29 | NESTED LOOPS | |
| | | |
| 30 | NESTED LOOPS | |
1 | 296 | 1 (0)| 00:00:01 |
| 31 | NESTED LOOPS | |
1 | 163 | 0 (0)| 00:00:01 |
| 32 | NESTED LOOPS | |
1 | 155 | 0 (0)| 00:00:01 |
|* 33 | TABLE ACCESS BY INDEX ROWID| DUG_D西药房住院处 |
1 | 26 | 0 (0)| 00:00:01 |
|* 34 | INDEX RANGE SCAN | PK_DUG_D西药房住院|
1 | | 0 (0)| 00:00:01 |
| 35 | TABLE ACCESS BY INDEX ROWID| DUG_D西药房住院处 |
1 | 129 | 0 (0)| 00:00:01 |
|* 36 | INDEX RANGE SCAN | IK_D西药住院处方明|
1 | | 0 (0)| 00:00:01 |
| 37 | TABLE ACCESS BY INDEX ROWID | DOC_T药品目录_价格|
1 | 8 | 0 (0)| 00:00:01 |
|* 38 | INDEX UNIQUE SCAN | PK_T药品目录_价格 |
1 | | 0 (0)| 00:00:01 |
|* 39 | INDEX UNIQUE SCAN | PK_T药品目录 |
1 | | 0 (0)| 00:00:01 |
| 40 | TABLE ACCESS BY INDEX ROWID | DOC_T药品目录 |
1 | 133 | 1 (0)| 00:00:01 |
| 41 | NESTED LOOPS | |
| | | |
| 42 | NESTED LOOPS | |
1 | 237 | 1 (0)| 00:00:01 |
| 43 | NESTED LOOPS | |
1 | 163 | 0 (0)| 00:00:01 |
| 44 | NESTED LOOPS | |
1 | 155 | 0 (0)| 00:00:01 |
|* 45 | TABLE ACCESS BY INDEX ROWID| DUG_D中药房住院处 |
1 | 39 | 0 (0)| 00:00:01 |
|* 46 | INDEX RANGE SCAN | PK_D中药房住院处方|
1 | | 0 (0)| 00:00:01 |
| 47 | TABLE ACCESS BY INDEX ROWID| DUG_D中药房住院处 |
1 | 116 | 0 (0)| 00:00:01 |
|* 48 | INDEX RANGE SCAN | IDX_120313_单据序 |
1 | | 0 (0)| 00:00:01 |
| 49 | TABLE ACCESS BY INDEX ROWID | DOC_T中药目录_价格|
1 | 8 | 0 (0)| 00:00:01 |
|* 50 | INDEX UNIQUE SCAN | PK_T中药目录_价格 |
1 | | 0 (0)| 00:00:01 |
|* 51 | INDEX UNIQUE SCAN | PK_T中药目录 |
1 | | 0 (0)| 00:00:01 |
| 52 | TABLE ACCESS BY INDEX ROWID | DOC_T中药目录 |
1 | 74 | 1 (0)| 00:00:01 |
|* 53 | TABLE ACCESS BY INDEX ROWID | INQ_D住院费用明细 |
1 | 46 | 0 (0)| 00:00:01 |
| 54 | BITMAP CONVERSION TO ROWIDS | |
| | | |
| 55 | BITMAP AND | |
| | | |
| 56 | BITMAP CONVERSION FROM ROWIDS | |
| | | |
|* 57 | INDEX RANGE SCAN | IDX_120675_住院序 |
1 | | 0 (0)| 00:00:01 |
| 58 | BITMAP CONVERSION FROM ROWIDS | |
| | | |
|* 59 | INDEX RANGE SCAN | IDX_120675_结算序 |
1 | | 0 (0)| 00:00:01 |
|* 60 | INDEX UNIQUE SCAN | PK_INQ_D住院费用列|
1 | 7 | 0 (0)| 00:00:01 |
| 61 | TABLE ACCESS BY INDEX ROWID | DOC_T发票项目 |
1 | 14 | 1 (0)| 00:00:01 |
|* 62 | INDEX UNIQUE SCAN | PK_T发票项目 |
1 | | 0 (0)| 00:00:01 |
|* 63 | INDEX UNIQUE SCAN | PK_T收费项目价格表|
1 | | 0 (0)| 00:00:01 |
|* 64 | TABLE ACCESS BY INDEX ROWID | DOC_T收费项目价格 |
1 | 10 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
------------------------------------

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

4 - filter(SUM("数量")<>0)
8 - filter(TO_DATE('2019-03-04 13:43','yyyy-MM-dd HH24:mi:ss')<=TO_DATE('2019
-03-06 23:59','yyyy-MM-dd
HH24:mi:ss'))
13 - filter("A"."开单科室I"=31 AND "A"."记账时间">=TO_DATE('2019-03-04 13:43',
'yyyy-MM-dd HH24:mi:ss') AND
"A"."处方序号I"=0 AND "A"."结算序号I"=0 AND "A"."记账时间"<=TO_DAT
E('2019-03-06 23:59','yyyy-MM-dd HH24:mi:ss') AND
"A"."开单医师R" IS NOT NULL)
14 - access("A"."住院序号I"=418)
16 - access("FP"."系统序号"(+)="A"."发票序号I")
17 - filter("Z"."婴儿序号I"=0)
18 - access("A"."单据序号I"="Z"."系统序号")
19 - access("C"."系统序号"="A"."收费项目序号I")
21 - filter(TO_DATE('2019-03-04 13:43','yyyy-MM-dd HH24:mi:ss')<=TO_DATE('2019
-03-06 23:59','yyyy-MM-dd
HH24:mi:ss'))
33 - filter("A"."记账否B"=1)
34 - access("A"."系统序号">0)
36 - access("A"."系统序号"="B"."单据序号I")
filter("B"."单据序号I">0)
38 - access("C"."系统序号"="B"."药品序号I")
39 - access("D"."系统序号"="C"."药品目录序号I")
45 - filter("A"."记账否B"=1)
46 - access("A"."系统序号">0)
48 - access("A"."系统序号"="B"."单据序号I")
filter("B"."单据序号I">0)
50 - access("C"."系统序号"="B"."药品序号I")
51 - access("D"."系统序号"="C"."药品目录序号I")
53 - filter("A"."处方序号I">0 AND "A"."开单科室I"=31 AND "A"."记账时间">=TO_DA
TE('2019-03-04 13:43','yyyy-MM-dd
HH24:mi:ss') AND "A"."记账时间"<=TO_DATE('2019-03-06 23:59','yyyy-
MM-dd HH24:mi:ss') AND "A"."开单医师R" IS NOT
NULL AND "A"."处方序号I"="B"."系统序号" AND "A"."处方类型"=SYS_OP_
C2C("B"."处方类型"))
57 - access("A"."住院序号I"=418)
59 - access("A"."结算序号I"=0)
60 - access("A"."单据序号I"="C"."系统序号")
62 - access("FP"."系统序号"(+)="A"."发票序号I")
63 - access("E"."系统序号"="A"."收费项目序号I")
64 - filter("E"."项目序号I" IS NOT NULL)

已选择109行。


执行计划中 id = 54 关键字为BITMAP CONVERSION TO ROWIDS 通常oltp系统 出现效率肯定不高
出现这样的情况,是因为表中存在不适当的索引,这些索引列的唯一度不高,oracle就有可能选择两个这样的索引转为bitmap来执行

根据这两个索引的值再确认共同有的ROWID,最后再通过ROWID回表提取符合条件的数据。

通常可以使用hint 或者 删除选择率低的索引,建立复合索引进行改善,通过分析此表在应用中其它模块都用用的,避免影响到其他模块的使用,通过hint方式改善

扫描二维码关注公众号,回复: 5456410 查看本文章

优化后 

explain plan for select /*+ opt_param('_b_tree_bitmap_plans','false') */ 发票序号i,
(case
when 发票序号i is null then
'合计'
when 发票序号 is null then
'小计'
else
to_char(发票序号)
end) as 发票序号,
发票顺序,
收费项目序号i,
收费项目序号,
规格说明,
数量,
计量单位,
执行单价,
sum(执行金额) as 执行金额,
医保类别,
农合类别,
套外否,
处方序号I
from (select 发票序号i,
发票序号,
发票顺序,
收费项目序号i,
收费项目序号,
规格说明,
sum(数量) as 数量,
计量单位,
执行单价,
sum(执行金额) as 执行金额,
医保类别,
农合类别,
套外否,
处方序号I
From (select nvl(发票序号i, 0) as 发票序号i,
nvl(发票序号, '未设置') as 发票序号,
发票顺序,
收费项目序号i,
收费项目序号,
规格说明,
数量,
计量单位,
执行单价,
执行金额,
医保类别,
农合类别,
套外否,
0 As 处方序号I
from inq_vd住院费用明细_发票
Where 住院序号i = '418'
And 处方序号i = 0
And 结算序号i = 0
And 婴儿序号I = 0
And 开单科室I = '31'
and 记账时间 between
to_date('2019-03-04 13:43', 'yyyy-MM-dd HH24:mi:ss') and
to_date('2019-03-06 23:59', 'yyyy-MM-dd HH24:mi:ss')
Union All
select nvl(发票序号i, 0) as 发票序号i,
nvl(发票序号, '未设置') as 发票序号,
发票顺序,
收费项目序号i,
收费项目序号,
规格说明,
数量,
计量单位,
执行单价,
执行金额,
医保类别,
农合类别,
套外否,
1 As 处方序号I
from INQ_VD住院费用明细_处方明细
Where 住院序号i = '418'
And 结算序号i = 0
And 婴儿序号I = 0
And 开单科室I = '31'
and 记账时间 between
to_date('2019-03-04 13:43', 'yyyy-MM-dd HH24:mi:ss') and
to_date('2019-03-06 23:59', 'yyyy-MM-dd HH24:mi:ss')) A
group by 发票序号i,
发票序号,
发票顺序,
收费项目序号i,
收费项目序号,
规格说明,
计量单位,
执行单价,
医保类别,
农合类别,
套外否,
处方序号I) A
where A.数量 <> 0
group by grouping sets((发票序号i, 发票序号, 发票顺序, 收费项目序号i, 收费项目序号, 规格说明, 数量, 计量单位, 执行单价, 医保类别, 农合类别, 套外否, 处方序号I), A.发票序号I,())
Order By 发票序号I, 发票顺序;


SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----------------------------------------
Plan hash value: 4198535495

--------------------------------------------------------------------------------
------------------------------------
| Id | Operation | Name | Row
s | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
------------------------------------
| 0 | SELECT STATEMENT | |
1 | 639 | 10 (20)| 00:00:01 |
| 1 | SORT ORDER BY | |
1 | 639 | 10 (20)| 00:00:01 |
| 2 | SORT GROUP BY ROLLUP | |
1 | 639 | 10 (20)| 00:00:01 |
| 3 | VIEW | |
1 | 639 | 9 (12)| 00:00:01 |
|* 4 | FILTER | |
| | | |
| 5 | HASH GROUP BY | |
1 | 639 | 9 (12)| 00:00:01 |
| 6 | VIEW | |
2 | 1278 | 8 (0)| 00:00:01 |
| 7 | UNION-ALL | |
| | | |
|* 8 | FILTER | |
| | | |
| 9 | NESTED LOOPS | |
| | | |
| 10 | NESTED LOOPS | |
1 | 156 | 5 (0)| 00:00:01 |
| 11 | NESTED LOOPS | |
1 | 122 | 4 (0)| 00:00:01 |
| 12 | NESTED LOOPS OUTER | |
1 | 113 | 3 (0)| 00:00:01 |
|* 13 | TABLE ACCESS BY INDEX ROWID | INQ_D住院费用明细 |
1 | 99 | 2 (0)| 00:00:01 |
|* 14 | INDEX RANGE SCAN | IDX_120675_住院序 |
1 | | 1 (0)| 00:00:01 |
| 15 | TABLE ACCESS BY INDEX ROWID | DOC_T发票项目 |
1 | 14 | 1 (0)| 00:00:01 |
|* 16 | INDEX UNIQUE SCAN | PK_T发票项目 |
1 | | 0 (0)| 00:00:01 |
|* 17 | TABLE ACCESS BY INDEX ROWID | INQ_D住院费用列表 |
1 | 9 | 1 (0)| 00:00:01 |
|* 18 | INDEX UNIQUE SCAN | PK_INQ_D住院费用列|
1 | | 0 (0)| 00:00:01 |
|* 19 | INDEX UNIQUE SCAN | PK_T收费项目价格表|
1 | | 0 (0)| 00:00:01 |
| 20 | TABLE ACCESS BY INDEX ROWID | DOC_T收费项目价格 |
1 | 34 | 1 (0)| 00:00:01 |
|* 21 | FILTER | |
| | | |
| 22 | NESTED LOOPS | |
| | | |
| 23 | NESTED LOOPS | |
1 | 2316 | 3 (0)| 00:00:01 |
| 24 | NESTED LOOPS OUTER | |
1 | 2306 | 2 (0)| 00:00:01 |
| 25 | NESTED LOOPS | |
1 | 2292 | 1 (0)| 00:00:01 |
| 26 | NESTED LOOPS | |
1 | 2285 | 1 (0)| 00:00:01 |
| 27 | VIEW | |
1 | 2239 | 0 (0)| 00:00:01 |
| 28 | UNION-ALL | |
| | | |
| 29 | NESTED LOOPS | |
| | | |
| 30 | NESTED LOOPS | |
1 | 296 | 1 (0)| 00:00:01 |
| 31 | NESTED LOOPS | |
1 | 163 | 0 (0)| 00:00:01 |
| 32 | NESTED LOOPS | |
1 | 155 | 0 (0)| 00:00:01 |
|* 33 | TABLE ACCESS BY INDEX ROWID| DUG_D西药房住院处 |
1 | 26 | 0 (0)| 00:00:01 |
|* 34 | INDEX RANGE SCAN | PK_DUG_D西药房住院|
1 | | 0 (0)| 00:00:01 |
| 35 | TABLE ACCESS BY INDEX ROWID| DUG_D西药房住院处 |
1 | 129 | 0 (0)| 00:00:01 |
|* 36 | INDEX RANGE SCAN | IK_D西药住院处方明|
1 | | 0 (0)| 00:00:01 |
| 37 | TABLE ACCESS BY INDEX ROWID | DOC_T药品目录_价格|
1 | 8 | 0 (0)| 00:00:01 |
|* 38 | INDEX UNIQUE SCAN | PK_T药品目录_价格 |
1 | | 0 (0)| 00:00:01 |
|* 39 | INDEX UNIQUE SCAN | PK_T药品目录 |
1 | | 0 (0)| 00:00:01 |
| 40 | TABLE ACCESS BY INDEX ROWID | DOC_T药品目录 |
1 | 133 | 1 (0)| 00:00:01 |
| 41 | NESTED LOOPS | |
| | | |
| 42 | NESTED LOOPS | |
1 | 237 | 1 (0)| 00:00:01 |
| 43 | NESTED LOOPS | |
1 | 163 | 0 (0)| 00:00:01 |
| 44 | NESTED LOOPS | |
1 | 155 | 0 (0)| 00:00:01 |
|* 45 | TABLE ACCESS BY INDEX ROWID| DUG_D中药房住院处 |
1 | 39 | 0 (0)| 00:00:01 |
|* 46 | INDEX RANGE SCAN | PK_D中药房住院处方|
1 | | 0 (0)| 00:00:01 |
| 47 | TABLE ACCESS BY INDEX ROWID| DUG_D中药房住院处 |
1 | 116 | 0 (0)| 00:00:01 |
|* 48 | INDEX RANGE SCAN | IDX_120313_单据序 |
1 | | 0 (0)| 00:00:01 |
| 49 | TABLE ACCESS BY INDEX ROWID | DOC_T中药目录_价格|
1 | 8 | 0 (0)| 00:00:01 |
|* 50 | INDEX UNIQUE SCAN | PK_T中药目录_价格 |
1 | | 0 (0)| 00:00:01 |
|* 51 | INDEX UNIQUE SCAN | PK_T中药目录 |
1 | | 0 (0)| 00:00:01 |
| 52 | TABLE ACCESS BY INDEX ROWID | DOC_T中药目录 |
1 | 74 | 1 (0)| 00:00:01 |
|* 53 | TABLE ACCESS BY INDEX ROWID | INQ_D住院费用明细 |
1 | 46 | 1 (0)| 00:00:01 |
|* 54 | INDEX RANGE SCAN | IDX_120675_住院序 |
1 | | 0 (0)| 00:00:01 |
|* 55 | INDEX UNIQUE SCAN | PK_INQ_D住院费用列|
1 | 7 | 0 (0)| 00:00:01 |
| 56 | TABLE ACCESS BY INDEX ROWID | DOC_T发票项目 |
1 | 14 | 1 (0)| 00:00:01 |
|* 57 | INDEX UNIQUE SCAN | PK_T发票项目 |
1 | | 0 (0)| 00:00:01 |
|* 58 | INDEX UNIQUE SCAN | PK_T收费项目价格表|
1 | | 0 (0)| 00:00:01 |
|* 59 | TABLE ACCESS BY INDEX ROWID | DOC_T收费项目价格 |
1 | 10 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
------------------------------------

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

4 - filter(SUM("数量")<>0)
8 - filter(TO_DATE('2019-03-04 13:43','yyyy-MM-dd HH24:mi:ss')<=TO_DATE('2019
-03-06 23:59','yyyy-MM-dd
HH24:mi:ss'))
13 - filter("A"."开单科室I"=31 AND "A"."记账时间">=TO_DATE('2019-03-04 13:43',
'yyyy-MM-dd HH24:mi:ss') AND
"A"."处方序号I"=0 AND "A"."结算序号I"=0 AND "A"."记账时间"<=TO_DAT
E('2019-03-06 23:59','yyyy-MM-dd HH24:mi:ss') AND
"A"."开单医师R" IS NOT NULL)
14 - access("A"."住院序号I"=418)
16 - access("FP"."系统序号"(+)="A"."发票序号I")
17 - filter("Z"."婴儿序号I"=0)
18 - access("A"."单据序号I"="Z"."系统序号")
19 - access("C"."系统序号"="A"."收费项目序号I")
21 - filter(TO_DATE('2019-03-04 13:43','yyyy-MM-dd HH24:mi:ss')<=TO_DATE('2019
-03-06 23:59','yyyy-MM-dd
HH24:mi:ss'))
33 - filter("A"."记账否B"=1)
34 - access("A"."系统序号">0)
36 - access("A"."系统序号"="B"."单据序号I")
filter("B"."单据序号I">0)
38 - access("C"."系统序号"="B"."药品序号I")
39 - access("D"."系统序号"="C"."药品目录序号I")
45 - filter("A"."记账否B"=1)
46 - access("A"."系统序号">0)
48 - access("A"."系统序号"="B"."单据序号I")
filter("B"."单据序号I">0)
50 - access("C"."系统序号"="B"."药品序号I")
51 - access("D"."系统序号"="C"."药品目录序号I")
53 - filter("A"."处方序号I">0 AND "A"."开单科室I"=31 AND "A"."记账时间">=TO_DA
TE('2019-03-04 13:43','yyyy-MM-dd
HH24:mi:ss') AND "A"."结算序号I"=0 AND "A"."记账时间"<=TO_DATE('20
19-03-06 23:59','yyyy-MM-dd HH24:mi:ss') AND
"A"."开单医师R" IS NOT NULL AND "A"."处方序号I"="B"."系统序号" AND
"A"."处方类型"=SYS_OP_C2C("B"."处方类型"))
54 - access("A"."住院序号I"=418)
55 - access("A"."单据序号I"="C"."系统序号")
57 - access("FP"."系统序号"(+)="A"."发票序号I")
58 - access("E"."系统序号"="A"."收费项目序号I")
59 - filter("E"."项目序号I" IS NOT NULL)

已选择103行。

建立索引后,SQL从原来的17s降低到0.8s,消耗也显著降低

猜你喜欢

转载自blog.csdn.net/ljl_name/article/details/88296833
今日推荐