视图套视图优化案例

一个查询界面,客户执行SQL语句 需等待16s 语句如下

 

Select *

  From (Select distinct A.*

          From inq_vd住院医嘱_执行情况_ A

          Left Join INQ_D住院医嘱临时列表 B

            On A.系统序号 = B.住院序号i

           And A.婴儿序号i = B.婴儿序号i

          Left Join Inq_D住院医嘱长期列表 C

            On A.系统序号 = C.住院序号i

           And A.婴儿序号i = C.婴儿序号i

         Where A.隶属机构I = 72

           And 状态N < 4) T

 Order By 病区序号i, 床位显示顺序, 当前床位I, 入院时间, 系统序号, 婴儿序号i;

 

其中inq_vd住院医嘱_执行情况_是一个视图.

inq_vd住院医嘱_执行情况_为:

 

create or replace view inq_vd住院医嘱_执行情况_ as

Select

       A.系统序号

       ,Null As 选择

       ,A.婴儿序号I

       ,A.同步序号

       ,A.隶属机构I

       ,A.隶属机构

       ,A.终端序号I

       ,A.健康序号I

       ,A.姓名

       ,A.拼音简码

       ,A.性别I,A.性别

       ,A.身份证号

       ,A.出生日期

       ,A.年龄

       ,A.病员类型I,A.病员类型

       ,A.病员费别I,A.病员费别

       ,A.入院情况N,A.入院情况

       ,A.入院时间

       ,A.入院备注

       ,A.门诊诊断

       ,A.入院诊断

       ,A.住院编号

       ,A.住院次数

       ,A.再入院B,A.再入院

       ,A.护理级别I

       ,A.护理级别

       ,A.病区序号I,A.病区序号

       ,A.当前科室I,A.当前科室

       ,A.当前床位I,A.当前床位,A.当前床位编码,A.床位显示顺序

       ,A.责任护士R,A.责任护士

       ,A.主管医师R,A.主管医师

       ,A.费用总额,A.结算总额

       ,A.住院总额

       ,A.预交总额

       ,A.当前余额

       ,A.可用余额

       ,A.状态N,A.状态,

       ('待审:'||to_char(nvl(C.待审核医嘱数量,0))||' 待执:'||to_char(nvl(C.待执行医嘱数量,0))||' 待停:'||to_char(nvl(C.待停止医嘱数量,0))) as 医嘱状态

       ,nvl(C.待审核医嘱数量,0) as 待审数量

       ,nvl(C.待执行医嘱数量,0) as 待执数量

       ,nvl(C.待停止医嘱数量,0) as 待停数量

From INQ_VD住院档案_医嘱执行列表  A

Left join

(

Select B.系统序号,B.姓名 as 姓名,B.病区序号I,B.婴儿序号I,nvl(A.待审核医嘱数量,0) as 待审核医嘱数量,nvl(C.待执次数,0) as 待执行医嘱数量,nvl(A.待停止医嘱数量,0) as 待停止医嘱数量

From INQ_VD住院档案_新生儿 B

Left Join (

    Select 住院序号i,Sum(case when 医嘱状态n=1 then 1 else 0 end) as 待审核医嘱数量,sum(case when 医嘱状态n=5 then 1 else 0 end) as 待停止医嘱数量,婴儿序号I From (

    Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱长期列表 Where 医嘱状态n=1 or 医嘱状态n=2 or 医嘱状态n=5

    Union All

    Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱临时列表 Where 医嘱状态n=1 or 医嘱状态n=2

    ) A group by 住院序号i,婴儿序号I

) A On A.住院序号i=B.系统序号 And A.婴儿序号I=B.婴儿序号I

Left Join (

    Select A.住院序号i,A.婴儿序号I,Sum(Case When A.医嘱类型='长期' And A.频率周期=1 then 周期次数-nvl(B.已执次数,0) When A.医嘱类型='临时' then abs(周期次数-nvl(B.已执次数,0)) else 0 end) as 待执次数 From INQ_VD住院医嘱执行单 A

    Left Join (

    Select 单据序号i,count(1) as 已执次数 From inq_d住院医嘱执行明细

    Where trunc(生成时间)=trunc(sysdate) And 标志n>0 Group by 单据序号i

  ) B On A.系统序号=B.单据序号i

  Where  a.医嘱类别<>'检查' And a.医嘱类别<>'检验' and ((起始日期<=trunc(sysdate) And (停止时间 is  null and 停止日期=trunc(sysdate) or to_date(停止时间,'yyyy-mm-dd hh24:mi')>=sysdate  And 医嘱类型='长期')) Or (停止日期=trunc(sysdate+1) And 医嘱类型='临时'))

  Group by A.住院序号i,婴儿序号I

) C On C.住院序号i=B.系统序号 And C.婴儿序号I=B.婴儿序号I

Where (nvl(A.待审核医嘱数量,0) >0 or nvl(C.待执次数,0) >0 or nvl(A.待停止医嘱数量,0)>0)

Order by B.系统序号

  ) C

On A.系统序号=C.系统序号 AND A.婴儿序号i=C.婴儿序号i;

 

 

上面视图 inq_vd住院医嘱_执行情况_ 中又内嵌三个视图 inq_vd住院档案_医嘱执行列表inq_vd住院档案_新生儿,inq_vd住院医嘱执行单

inq_vd住院档案_医嘱执行列表为:

 

create or replace view inq_vd住院档案_医嘱执行列表 as

Select

        A.系统序号

        ,A.婴儿序号i

        ,A.同步序号

        ,A.隶属机构I,B.名称 As 隶属机构

        ,A.终端序号I

        ,A.健康序号I

        ,A.姓名

        ,A.拼音简码

        ,A.性别I,C.名称 As 性别

        ,A.身份证号

        ,A.出生日期

        ,GetAge(A.年龄岁,A.年龄月,A.年龄天,A.年龄时) As 年龄

        ,A.病员类型I,H.名称 As 病员类型

        ,A.病员费别I,I.名称 As 病员费别

        ,A.入院情况N,decode(A.入院情况N,1,'',2,'',3,'一般') As 入院情况

        ,A.入院时间

        ,A.入院备注

        ,A.门诊诊断

        ,A.入院诊断

        ,A.住院编号

        ,A.住院次数

        ,A.再入院B,DeCode(A.再入院B,0,'',1,'') As 再入院

        ,A.护理级别I,P.名称 As 护理级别

        ,A.病区序号I,Q.名称 As 病区序号

        ,A.当前科室I,R.名称 As 当前科室

        ,A.当前床位I,S.名称 As 当前床位,S.编码 as 当前床位编码,S.显示顺序 As 床位显示顺序

        ,A.责任护士R,U.名称 As 责任护士

        ,A.主管医师R,V.名称 As 主管医师

        ,A.费用总额

        ,A.结算总额

        ,nvl(A.费用总额,0) + nvl(A.结算总额,0) as 住院总额

        ,nvl(A.预交总额,0) as 预交总额

        ,nvl(A.预交总额,0)-nvl(A.费用总额,0) as 当前余额

        ,nvl(A.预交总额,0)-nvl(A.费用总额,0) + nvl(A.担保金额,0) as 可用余额

        ,A.状态N,DeCode(A.状态N,0,'新入院',1,'在床',2,'暂离',3,'转科',4,'出院') As 状态

    From INQ_VD住院档案_新生儿 A

        Inner Join DOC_T机构列表 B On B.系统序号 = A.隶属机构I

        Left Join DOC_B性别 C On C.系统序号 = A.性别I

        Left Join DOC_T病人类型 H On H.系统序号 = A.病员类型I

        Left Join DOC_T病人费别 I On I.系统序号 = A.病员费别I

        Left Join DOC_B护理级别 P On P.系统序号 = A.护理级别I

        Left Join DOC_T病区档案 Q On Q.系统序号 = A.病区序号I

        Left Join DOC_T科室档案 R On R.系统序号 = A.当前科室I

        Left Join DOC_T病床档案 S On S.系统序号 = A.当前床位I

        Left Join DOC_T员工档案 U On U.系统序号 = A.责任护士R

        Left Join DOC_T员工档案 V On V.系统序号 = A.主管医师R

        Where A.状态N<4;

 

 

inq_vd住院档案_新生儿为:

 

create or replace view inq_vd住院档案_新生儿 as

Select

A.婴儿序号i,

A.系统序号,

A.同步序号,

A.隶属机构i,

A.终端序号i,

A.健康序号i,

A.门诊序号i,

A.姓名,

A.拼音简码,

A.性别i,

A.性别,

A.身份证号,

A.出生日期,

A.年龄,

A.年龄岁,

A.年龄月,

A.年龄天,

A.年龄时,

A.年龄分,

A.婚姻状况i,

A.民族i,

A.职业i,

A.工作单位,

A.身高,

A.体重,

A.联系电话,

A.现住址编码,

A.现住址,

A.邮政编码,

A.联系人,

A.联系人关系i,

A.联系人地址编码,

A.联系人地址,

A.联系人电话,

A.出生地编码,

A.出生地,

A.病员类型i,

A.病员费别i,

A.入院科室i,

A.入院床位i,

A.入院情况n,

A.入院途径n,

A.门诊医师r,

A.付款方式i,

A.入院时间,

A.入院操作人r,

A.入院操作时间,

A.入院备注,

A.住院编号,

A.住院次数,

A.再入院b,

A.护理级别i,

A.病区序号i,

A.当前科室i,

A.当前床位i,

A.入科时间,

A.入科操作人r,

A.责任护士r,

A.主管医师r,

A.费用总额,

A.结算总额,

A.预交总额,

A.状态n,

A.离院方式n,

A.住院天数,

A.出院时间,

A.出院操作人r,

A.出院操作时间,

A.出院备注,

A.预约序号i,

A.门诊诊断,

A.入院诊断,

A.担保金额,

A.出院诊断,

A.户口地址编码,

A.户口地址,

S.名称 as 当前床位,

S.编码 as 当前床位编码,

R.名称 as 当前科室

 From (

  Select

    0 as 婴儿序号i,

  A.系统序号,

A.同步序号,

A.隶属机构i,

A.终端序号i,

A.健康序号i,

A.门诊序号i,

A.姓名,

A.拼音简码,

A.性别i,C.名称 As 性别,

A.身份证号,

A.出生日期,

GetAge(A.年龄岁,A.年龄月,A.年龄天,A.年龄时) As 年龄,

A.年龄岁,

A.年龄月,

A.年龄天,

A.年龄时,

A.年龄分,

A.婚姻状况i,

A.民族i,

A.职业i,

A.工作单位,

A.身高,

A.体重,

A.联系电话,

A.现住址编码,

A.现住址,

A.邮政编码,

A.联系人,

A.联系人关系i,

A.联系人地址编码,

A.联系人地址,

A.联系人电话,

A.出生地编码,

A.出生地,

A.病员类型i,

A.病员费别i,

A.入院科室i,

A.入院床位i,

A.入院情况n,

A.入院途径n,

A.门诊医师r,

A.付款方式i,

A.入院时间,

A.入院操作人r,

A.入院操作时间,

A.入院备注,

A.住院编号,

A.住院次数,

A.再入院b,

A.护理级别i,

A.病区序号i,

A.当前科室i,

A.当前床位i,

A.入科时间,

A.入科操作人r,

A.责任护士r,

A.主管医师r,

A.费用总额,

A.结算总额,

A.预交总额,

A.状态n,

A.离院方式n,

A.住院天数,

A.出院时间,

A.出院操作人r,

A.出院操作时间,

A.出院备注,

A.预约序号i,

A.门诊诊断,

A.入院诊断,

A.担保金额,

A.出院诊断,

A.户口地址编码,

A.户口地址 From INQ_D住院档案 A

   Left Join DOC_B性别 C On C.系统序号 = A.性别I

  Union All

  Select

  B.系统序号 as 婴儿序号i,

  B.住院序号i as 系统序号,

A.同步序号,

A.隶属机构i,

A.终端序号i,

A.健康序号i,

A.门诊序号i,

to_char('[]')||B.姓名 as 姓名,

A.拼音简码,

B.性别i,C.名称 As 性别,

A.身份证号,

B.出生日期,

null As 年龄,

0 as 年龄岁,

0 as 年龄月,

0 as 年龄天,

0 as 年龄时,

0 as 年龄分,

A.婚姻状况i,

A.民族i,

A.职业i,

A.工作单位,

A.身高,

A.体重,

A.联系电话,

A.现住址编码,

A.现住址,

A.邮政编码,

A.联系人,

A.联系人关系i,

A.联系人地址编码,

A.联系人地址,

A.联系人电话,

A.出生地编码,

A.出生地,

A.病员类型i,

A.病员费别i,

A.入院科室i,

A.入院床位i,

A.入院情况n,

A.入院途径n,

A.门诊医师r,

A.付款方式i,

A.入院时间,

A.入院操作人r,

A.入院操作时间,

A.入院备注,

A.住院编号,

A.住院次数,

A.再入院b,

A.护理级别i,

A.病区序号i,

A.当前科室i,

A.当前床位i,

A.入科时间,

A.入科操作人r,

A.责任护士r,

A.主管医师r,

A.费用总额,

A.结算总额,

A.预交总额,

A.状态n,

A.离院方式n,

A.住院天数,

A.出院时间,

A.出院操作人r,

A.出院操作时间,

A.出院备注,

A.预约序号i,

A.门诊诊断,

A.入院诊断,

A.担保金额,

A.出院诊断,

A.户口地址编码,

A.户口地址 From INQ_D住院新生儿列表 B

  Inner Join INQ_D住院档案 A On B.住院序号i=A.系统序号

     Left Join DOC_B性别 C On C.系统序号 = B.性别I

  ) A

  Left Join DOC_T病床档案 S On S.系统序号 = A.当前床位I

  Left Join DOC_T科室档案 R On R.系统序号 = A.当前科室I;

 

 

inq_vd住院医嘱执行单为:

 

create or replace view inq_vd住院医嘱执行单 as

select

      A.系统序号

      ,A.同步序号

      ,A.医嘱类型

      ,A.住院序号i

      ,A.婴儿序号i

      ,to_char(A.起始时间,'yyyy-mm-dd hh24:mi') as 起始时间

      ,to_char(A.停止时间,'yyyy-mm-dd hh24:mi') as 停止时间

      ,A.医嘱内容

      ,A.用法

      ,trunc(A.起始时间) as 起始日期

      ,trunc(case when A.医嘱类型='长期' then nvl(A.停止时间,sysdate) else A.停止时间 end) as 停止日期

      ,A.起始医生

      ,A.停止医生

      ,A.周期次数

      ,A.频率周期

      ,A.医嘱业务序号

      ,A.分组标识

      ,A.给药方式i,B.名称 as 给药方式

      ,B.其他名称 as 给药方式其他名称

      ,B.类型N as 给药方式类型n,B.类型 as 给药方式类型

      ,A.用药频率i,C.名称 as 用药频率

      ,(case when A.医嘱类型='临时' then D.医嘱类别 else E.医嘱类别 end) as 医嘱类别

      ,(case when A.医嘱类型='临时' then D.医嘱目录序号I else E.医嘱目录序号I end) as 医嘱目录序号I

      ,A.上次记账时间

      ,A.上次记账人R

      ,D.用药天数

      ,nvl(D.使用量,1)*nvl(C.频率数量,1)*nvl(D.用药天数,1) 临时用药总量

      ,nvl(E.使用量,1)*nvl(C.频率数量,1) 长期用药总量

      ,case when A.医嘱类型='临时' and D.术中医嘱B=1 then Translate('术中' USING NCHAR_CS)

        else A.医嘱类型 end 显示医嘱类型,a.隶属机构i

      ,Nvl(K1.名称,K2.名称) As 药房名称

from INQ_D住院医嘱执行单 A

      Left Join DOC_VT给药方式 B On A.给药方式I=B.系统序号

      Left Join DOC_T用药频率 C On A.用药频率I=C.系统序号

      Left Join Inq_d住院医嘱临时列表 D On A.医嘱业务序号=D.系统序号 And A.医嘱类型='临时'

      Left Join Inq_d住院医嘱长期列表 E On A.医嘱业务序号=E.系统序号 And A.医嘱类型='长期'

      Left Join DOC_T科室档案 K1 On K1.系统序号=D.药房序号I

      Left Join DOC_T科室档案 K2 On K2.系统序号=E.药房序号I;

 

表   INQ_D住院医嘱执行单含有数据239872   (23万条记录);

表   DOC_VT给药方式94   (94条记录);

表   DOC_T用药频率含有数据26  (26条记录);

表   Inq_d住院医嘱临时列表含有数据174199    (17万条记录);

表   Inq_d住院医嘱长期列表含有数据103091    (10万条记录);

SQL语句的执行计划:

Select *

  From (Select distinct A.*

          From inq_vd住院医嘱_执行情况_ A

          Left Join INQ_D住院医嘱临时列表 B

            On A.系统序号 = B.住院序号i

           And A.婴儿序号i = B.婴儿序号i

          Left Join Inq_D住院医嘱长期列表 C

            On A.系统序号 = C.住院序号i

           And A.婴儿序号i = C.婴儿序号i

         Where A.隶属机构I = 72

           And 状态N < 4) T

 Order By 病区序号i, 床位显示顺序, 当前床位I, 入院时间, 系统序号, 婴儿序号i;

 

 

执行计划

Plan hash value: 3370269967

 

---------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                                      | Name             | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |---------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                               |                  |   429 |  1849K|       | 10848   (1)| 00:02:11 |

|   1 |  SORT ORDER BY                                 |                  |   429 |  1849K|       | 10848   (1)| 00:02:11 |

|   2 |   VIEW                                         |                  |   429 |  1849K|       | 10848   (1)| 00:02:11 |

|   3 |    HASH UNIQUE                                 |                  |   429 |   285K|       | 10848   (1)| 00:02:11 |

|*  4 |     HASH JOIN OUTER                            |                  |   429 |   285K|       | 10847   (1)| 00:02:11 |

|*  5 |      HASH JOIN RIGHT OUTER                     |                  |   429 |   282K|       | 10198   (1)| 00:02:03 |

|   6 |       VIEW                                     |                  |   680 | 38080 |       |  8760   (1)| 00:01:46 |

|*  7 |        FILTER                                  |                  |       |       |       |            |     |

|*  8 |         HASH JOIN OUTER                        |                  |   680 | 79560 |       |  8760   (1)| 00:01:46 |

|*  9 |          HASH JOIN OUTER                       |                  |   680 | 44200 |       |  5118   (2)| 00:01:02 |

|  10 |           VIEW                                 |                  |   680 | 17680 |       |  4   (0)| 00:00:01 |

|  11 |            UNION-ALL                           |                  |       |       |       |         |     |

|  12 |             INDEX FAST FULL SCAN               | PK_INQ_D住院档案 |   655 |  2620 |       |  2   (0)| 00:00:01 |

|  13 |             VIEW                               | index$_join$_044 |    25 |   200 |       |  2   (0)| 00:00:01 |

|* 14 |              HASH JOIN                         |                  |       |       |       |         |     |

|  15 |               INDEX FAST FULL SCAN             | IDX_108170_住院序|    25 |   200 |       |  1   (0)| 00:00:01 |

|  16 |               INDEX FAST FULL SCAN             | PK_INQ_D住院新生 |    25 |   200 |       |  1   (0)| 00:00:01 |

|  17 |           VIEW                                 |                  |  1649 | 64311 |       |  5114   (2)| 00:01:02 |

|  18 |            HASH GROUP BY                       |                  |  1649 |   132K|       |  5114   (2)| 00:01:02 |

|* 19 |             FILTER                             |                  |       |       |       |         |     |

|  20 |              NESTED LOOPS OUTER                |                  |  1799 |   144K|       |  5113   (2)| 00:01:02 |

|  21 |               NESTED LOOPS OUTER               |                  |  1799 |   126K|       |  3313   (2)| 00:00:40 |

|* 22 |                HASH JOIN OUTER                 |                  |  1799 |   108K|       |  2520   (3)| 00:00:31 |

|* 23 |                 TABLE ACCESS FULL              | INQ_D住院医嘱执行|  1799 | 79156 |       |  1664   (2)| 00:00:20 |

|  24 |                 VIEW                           |                  |  5407 | 97326 |       |   856   (4)| 00:00:11 |

|  25 |                  HASH GROUP BY                 |                  |  5407 | 86512 |       |   856   (4)| 00:00:11 |

|* 26 |                   INDEX FAST FULL SCAN         | IDX_108188_生成时|  5440 | 87040 |       |   855   (3)| 00:00:11 |

|  27 |                TABLE ACCESS BY INDEX ROWID     | INQ_D住院医嘱长期|     1 |    10 |       |  1   (0)| 00:00:01 |

|* 28 |                 INDEX UNIQUE SCAN              | PK_INQ_D住院长期 |     1 |       |       |  0   (0)| 00:00:01 |

|  29 |               TABLE ACCESS BY INDEX ROWID      | INQ_D住院医嘱临时|     1 |    10 |       |  1   (0)| 00:00:01 |

|* 30 |                INDEX UNIQUE SCAN               | PK_INQ_D住院临时 |     1 |       |       |  0   (0)| 00:00:01 |

|  31 |          VIEW                                  |                  |   147K|  7505K|       |  3642   (1)| 00:00:44 |

|  32 |           HASH GROUP BY                        |                  |   147K|  2886K|  4648K|  3642   (1)| 00:00:44 |

|  33 |            VIEW                                |                  |   147K|  2886K|       |  2741   (1)| 00:00:33 |

|  34 |             UNION-ALL                          |                  |       |       |       |         |     |

|* 35 |              TABLE ACCESS FULL                 | INQ_D住院医嘱长期| 50784 |   495K|       |   823   (1)| 00:00:10 |

|* 36 |              TABLE ACCESS FULL                 | INQ_D住院医嘱临时| 97026 |   947K|       |  1919   (1)| 00:00:24 |

|* 37 |       HASH JOIN RIGHT OUTER                    |                  |   429 |   259K|       |  1437   (1)| 00:00:18 |

|  38 |        TABLE ACCESS FULL                       | DOC_T病床档案    |   641 | 16025 |       |  5   (0)| 00:00:01 |

|* 39 |        HASH JOIN RIGHT OUTER                   |                  |   429 |   248K|       |  1432   (1)| 00:00:18 |

|  40 |         TABLE ACCESS FULL                      | DOC_T员工档案    |   520 |  8840 |       |  5   (0)| 00:00:01 |

|* 41 |         HASH JOIN RIGHT OUTER                  |                  |   429 |   241K|       |  1427   (1)| 00:00:18 |

|  42 |          TABLE ACCESS FULL                     | DOC_T员工档案    |   520 |  8840 |       |  5   (0)| 00:00:01 |

|  43 |          NESTED LOOPS OUTER                    |                  |   429 |   234K|       |  1422   (1)| 00:00:18 |

|* 44 |           HASH JOIN RIGHT OUTER                |                  |   429 |   231K|       |    42   (3)| 00:00:01 |

|  45 |            TABLE ACCESS FULL                   | DOC_T科室档案    |   156 |  2184 |       |  3   (0)| 00:00:01 |

|* 46 |            HASH JOIN RIGHT OUTER               |                  |   429 |   225K|       |    39   (3)| 00:00:01 |

|  47 |             TABLE ACCESS FULL                  | DOC_T病区档案    |    20 |   220 |       |  3   (0)| 00:00:01 |

|* 48 |             HASH JOIN RIGHT OUTER              |                  |   429 |   221K|       |    36   (3)| 00:00:01 |

|  49 |              TABLE ACCESS FULL                 | DOC_T病人费别    |     8 |    80 |       |  3   (0)| 00:00:01 |

|  50 |              NESTED LOOPS OUTER                |                  |   429 |   217K|       |    33   (4)| 00:00:01 |

|* 51 |               HASH JOIN RIGHT OUTER            |                  |   429 |   211K|       |    32   (4)| 00:00:01 |

|  52 |                TABLE ACCESS FULL               | DOC_B性别        |     4 |    44 |       |  3   (0)| 00:00:01 |

|* 53 |                HASH JOIN RIGHT OUTER           |                  |   429 |   207K|       |    29   (4)| 00:00:01 |

|  54 |                 TABLE ACCESS FULL              | DOC_T病人类型    |     3 |    30 |       |  3   (0)| 00:00:01 |

|  55 |                 NESTED LOOPS                   |                  |   429 |   203K|       |    26   (4)| 00:00:01 |

|  56 |                  TABLE ACCESS BY INDEX ROWID   | DOC_T机构列表    |     1 |    16 |       |  1   (0)| 00:00:01 |

|* 57 |                   INDEX UNIQUE SCAN            | PK_T机构列表     |     1 |       |       |  0   (0)| 00:00:01 |

|  58 |                  VIEW                          |                  |   429 |   196K|       |    25   (4)| 00:00:01 |

|  59 |                   UNION-ALL                    |                  |       |       |       |         |     |

|* 60 |                    TABLE ACCESS FULL           | INQ_D住院档案    |   404 |   141K|       |    11   (0)| 00:00:01 |

|  61 |                    MERGE JOIN                  |                  |    25 |  9625 |       |    14   (8)| 00:00:01 |

|  62 |                     TABLE ACCESS BY INDEX ROWID| INQ_D住院新生儿列|    25 |   850 |       |  2   (0)| 00:00:01 |

|  63 |                      INDEX FULL SCAN           | IDX_108170_住院序|    25 |       |       |  1   (0)| 00:00:01 |

|* 64 |                     SORT JOIN                  |                  |   404 |   138K|       |    12   (9)| 00:00:01 |

|* 65 |                      TABLE ACCESS FULL         | INQ_D住院档案    |   404 |   138K|       |    11   (0)| 00:00:01 |

|  66 |               TABLE ACCESS BY INDEX ROWID      | DOC_B护理级别    |     1 |    12 |       |  1   (0)| 00:00:01 |

|* 67 |                INDEX UNIQUE SCAN               | PK_B护理级别     |     1 |       |       |  0   (0)| 00:00:01 |

|  68 |           BITMAP CONVERSION TO ROWIDS          |                  |     1 |     7 |       |  1422   (1)| 00:00:18 |

|  69 |            BITMAP AND                          |                  |       |       |       |         |    |

|  70 |             BITMAP CONVERSION FROM ROWIDS      |                  |       |       |       |         |    |

|* 71 |              INDEX RANGE SCAN                  | IDX_108178_婴儿序|    37 |       |       |  1   (0)| 00:00:01 |

|  72 |             BITMAP CONVERSION FROM ROWIDS      |                  |       |       |       |         |     |

|* 73 |              INDEX RANGE SCAN                  | IDX_108178_住院序|    37 |       |       |  2   (0)| 00:00:01 |

|  74 |      VIEW                                      | index$_join$_005 |   101K|   694K|       |   649   (1)| 00:00:08 |

|* 75 |       HASH JOIN                                |                  |       |       |       |         | |

|  76 |        INDEX FAST FULL SCAN                    | IDX_108174_婴儿序|   101K|   694K|       |   235   (1)| 00:00:03 |

|  77 |        INDEX FAST FULL SCAN                    | IDX_108174_住院序|   101K|   694K|       |   268   (0)| 00:00:04 |

-------------------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   4 - access("A"."婴儿序号I"="C"."婴儿序号I"(+) AND "A"."系统序号"="C"."住院序号I"(+))

   5 - access("A"."婴儿序号I"="C"."婴儿序号I"(+) AND "A"."系统序号"="C"."系统序号"(+))

   7 - filter(NVL("A"."待审核医嘱数量",0)>0 OR NVL("C"."待执次数",0)>0 OR NVL("A"."待停止医嘱数量",0)>0)

   8 - access("A"."婴儿序号I"(+)="A"."婴儿序号I" AND "A"."住院序号I"(+)="A"."系统序号")

   9 - access("C"."婴儿序号I"(+)="A"."婴儿序号I" AND "C"."住院序号I"(+)="A"."系统序号")

  14 - access(ROWID=ROWID)

  19 - filter(CASE "A"."医嘱类型" WHEN U'\4E34\65F6' THEN "D"."医嘱类别" ELSE "E"."医嘱类别" END <>U'\68C0\67E5' AND CASE

              "A"."医嘱类型" WHEN U'\4E34\65F6' THEN "D"."医嘱类别" ELSE "E"."医嘱类别" END <>U'\68C0\9A8C')

  22 - access("A"."系统序号"="B"."单据序号I"(+))

  23 - filter("A"."医嘱类型"=U'\4E34\65F6' AND TRUNC(CASE "A"."医嘱类型" WHEN U'\957F\671F' THEN NVL("A"."停止时间",SYSDATE@!)

              ELSE "A"."停止时间" END )=TRUNC(SYSDATE@!+1) OR ("A"."医嘱类型"=U'\957F\671F' AND

              TO_DATE(TO_CHAR(INTERNAL_FUNCTION("A"."停止时间"),'yyyy-mm-dd hh24:mi'),'yyyy-mm-dd hh24:mi')>=SYSDATE@! OR

              TO_CHAR(INTERNAL_FUNCTION("A"."停止时间"),'yyyy-mm-dd hh24:mi') IS NULL AND TRUNC(CASE "A"."医嘱类型" WHEN U'\957F\671F'

              THEN NVL("A"."停止时间",SYSDATE@!) ELSE "A"."停止时间" END )=TRUNC(SYSDATE@!)) AND

              TRUNC(INTERNAL_FUNCTION("A"."起始时间"))<=TRUNC(SYSDATE@!))

  26 - filter("标志N">0 AND TRUNC(INTERNAL_FUNCTION("生成时间"))=TRUNC(SYSDATE@!))

  28 - access("A"."医嘱业务序号"="E"."系统序号"(+))

       filter("A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN "E"."系统序号"(+) IS NOT NULL THEN '长期' ELSE '长期' END ))

  30 - access("A"."医嘱业务序号"="D"."系统序号"(+))

       filter("A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN "D"."系统序号"(+) IS NOT NULL THEN '临时' ELSE '临时' END ))

  35 - filter("医嘱状态N"=1 OR "医嘱状态N"=2 OR "医嘱状态N"=5)

  36 - filter("医嘱状态N"=1 OR "医嘱状态N"=2)

  37 - access("S"."系统序号"(+)="A"."当前床位I")

  39 - access("V"."系统序号"(+)="A"."主管医师R")

  41 - access("U"."系统序号"(+)="A"."责任护士R")

  44 - access("R"."系统序号"(+)="A"."当前科室I")

  46 - access("Q"."系统序号"(+)="A"."病区序号I")

  48 - access("I"."系统序号"(+)="A"."病员费别I")

  51 - access("C"."系统序号"(+)="A"."性别I")

  53 - access("H"."系统序号"(+)="A"."病员类型I")

  57 - access("B"."系统序号"=72)

  60 - filter("A"."状态N"<4 AND "A"."隶属机构I"=72)

  64 - access("B"."住院序号I"="A"."系统序号")

       filter("B"."住院序号I"="A"."系统序号")

  65 - filter("A"."状态N"<4 AND "A"."隶属机构I"=72)

  67 - access("P"."系统序号"(+)="A"."护理级别I")

  71 - access("A"."婴儿序号I"="B"."婴儿序号I"(+))

  73 - access("A"."系统序号"="B"."住院序号I"(+))

  75 - access(ROWID=ROWID)

 

 

统计信息

----------------------------------------------------------

     248690  recursive calls

          0  db block gets

     194467  consistent gets

      14122  physical reads

          0  redo size

     100190  bytes sent via SQL*Net to client

        816  bytes received via SQL*Net from client

         29  SQL*Net roundtrips to/from client

          2  sorts (memory)

          0  sorts (disk)

        419  rows processed

 

 

对于上述的执行计划,出现BITMAP 索引中,通常BITMAP适用于OLAP系统,发生在OLTP系统中一般出现这种情况,都是对表建立不合适的index导致,特别是对表中的唯一度不高的列建立了index,然后oracle就有可能选择两个这样的列转为为bitmap来执行。

 

新建create index  IDX_108178_婴儿住院序号I on INQ_D住院医嘱临时列表(婴儿序号I, 住院序号I)

之前大约16秒出来,建立新index后速度是7秒出来结果。

 

现在的执行计划为:

Plan hash value: 409422733

 

---------------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                                          | Name               | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                                   |                    |   429 |  1849K|    |  8929   (1)| 00:01:48 |

|   1 |  SORT ORDER BY                                     |                    |   429 |  1849K|    |  8929   (1)| 00:01:48 |

|   2 |   VIEW                                             |                    |   429 |  1849K|    |  8929   (1)| 00:01:48 |

|   3 |    HASH UNIQUE                                     |                    |   429 |   285K|    |  8929   (1)| 00:01:48 |

|*  4 |     HASH JOIN RIGHT OUTER                          |                    |   429 |   285K|    |  8928  (1)| 00:01:48 |

|   5 |      TABLE ACCESS FULL                             | DOC_T员工档案      |   520 |  8840 |    |     5   (0)| 00:00:01 |

|*  6 |      HASH JOIN RIGHT OUTER                         |                    |   429 |   278K|    |  8923   (1)| 00:01:48 |

|   7 |       TABLE ACCESS FULL                            | DOC_T员工档案      |   520 |  8840 |    |     5   (0)| 00:00:01 |

|*  8 |       HASH JOIN RIGHT OUTER                        |                    |   429 |   271K|    |  8918   (1)| 00:01:48 |

|   9 |        TABLE ACCESS FULL                           | DOC_T科室档案      |   156 |  2184 |    |     3   (0)| 00:00:01 |

|* 10 |        HASH JOIN RIGHT OUTER                       |                    |   429 |   265K|    |  8914   (1)| 00:01:47 |

|  11 |         TABLE ACCESS FULL                          | DOC_B性别          |     4 |    44 |    |     3   (0)| 00:00:01 |

|* 12 |         HASH JOIN RIGHT OUTER                      |                    |   429 |   261K|    |  8911 (1)| 00:01:47 |

|  13 |          TABLE ACCESS FULL                         | DOC_T病区档案      |    20 |   220 |    |     3   (0)| 00:00:01 |

|* 14 |          HASH JOIN RIGHT OUTER                     |                    |   429 |   256K|    |  8908  (1)| 00:01:47 |

|  15 |           TABLE ACCESS FULL                        | DOC_T病床档案      |   641 | 16025 |    |     5  (0)| 00:00:01 |

|* 16 |           HASH JOIN RIGHT OUTER                    |                    |   429 |   245K|    |  8903   (1)| 00:01:47 |

|  17 |            TABLE ACCESS FULL                       | DOC_T病人费别      |     8 |    80 |    |     3   (0)| 00:00:01 |

|* 18 |            HASH JOIN RIGHT OUTER                   |                    |   429 |   241K|    |  8900   (1)| 00:01:47 |

|  19 |             TABLE ACCESS FULL                      | DOC_T病人类型      |     3 |    30 |    |     3   (0)| 00:00:01 |

|* 20 |             HASH JOIN OUTER                        |                    |   429 |   237K|    |  8897   (1)| 00:01:47 |

|* 21 |              HASH JOIN OUTER                       |                    |   429 |   234K|    |  8739  (1)| 00:01:45 |

|* 22 |               HASH JOIN RIGHT OUTER                |                    |   429 |   231K|    |  8089  (1)| 00:01:38 |

|  23 |                VIEW                                |                    |   680 | 38080 |    |  8062   (1)| 00:01:37 |

|* 24 |                 FILTER                             |                    |       |       |    |       |          |

|* 25 |                  HASH JOIN OUTER                   |                    |   680 | 79560 |    |  8062  (1)| 00:01:37 |

|* 26 |                   HASH JOIN OUTER                  |                    |   680 | 44200 |    |  5118   (2)| 00:01:02 |

|  27 |                    VIEW                            |                    |   680 | 17680 |    |     4  (0)| 00:00:01 |

|  28 |                     UNION-ALL                      |                    |       |       |    |       |          |

|  29 |                      INDEX FAST FULL SCAN          | PK_INQ_D住院档案   |   655 |  2620 |    |     2  (0)| 00:00:01 |

|  30 |                      VIEW                          | index$_join$_044   |    25 |   200 |    |     2  (0)| 00:00:01 |

|* 31 |                       HASH JOIN                    |                    |       |       |    |       |          |

|  32 |                        INDEX FAST FULL SCAN        | IDX_108170_住院序号|    25 |   200 |    |     1   (0)| 00:00:01 |

|  33 |                        INDEX FAST FULL SCAN        | PK_INQ_D住院新生儿 |    25 |   200 |    |     1  (0)| 00:00:01 |

|  34 |                    VIEW                            |                    |  1649 | 64311 |    |  5114  (2)| 00:01:02 |

|  35 |                     HASH GROUP BY                  |                    |  1649 |   132K|    |  5114  (2)| 00:01:02 |

|* 36 |                      FILTER                        |                    |       |       |    |       |          |

|  37 |                       NESTED LOOPS OUTER           |                    |  1799 |   144K|    |  5113  (2)| 00:01:02 |

|  38 |                        NESTED LOOPS OUTER          |                    |  1799 |   126K|    |  3313  (2)| 00:00:40 |

|* 39 |                         HASH JOIN OUTER            |                    |  1799 |   108K|    |  2520  (3)| 00:00:31 |

|* 40 |                          TABLE ACCESS FULL         | INQ_D住院医嘱执行单|  1799 | 79156 |    |  1664  (2)| 00:00:20 |

|  41 |                          VIEW                      |                    |  5407 | 97326 |    |   856  (4)| 00:00:11 |

|  42 |                           HASH GROUP BY            |                    |  5407 | 86512 |    |   856  (4)| 00:00:11 |

|* 43 |                            INDEX FAST FULL SCAN    | IDX_108188_生成时间|  5440 | 87040 |    |   855  (3)| 00:00:11 |

|  44 |                         TABLE ACCESS BY INDEX ROWID| INQ_D住院医嘱长期列|     1 |    10 |    |     1  (0)| 00:00:01 |

|* 45 |                          INDEX UNIQUE SCAN         | PK_INQ_D住院长期医 |     1 |       |    |     0  (0)| 00:00:01 |

|  46 |                        TABLE ACCESS BY INDEX ROWID | INQ_D住院医嘱临时列|     1 |    10 |    |     1 (0)| 00:00:01 |

|* 47 |                         INDEX UNIQUE SCAN          | PK_INQ_D住院临时医 |     1 |       |    |     0  (0)| 00:00:01 |

|  48 |                   VIEW                             |                    |   147K|  7505K|    |  2943   (1)| 00:00:36 |

|  49 |                    HASH GROUP BY                   |                    |   147K|  2886K|  4648K|  2943   (1)|00:00:36 |

|  50 |                     VIEW                           |                    |   147K|  2886K|    |  2043  (1)| 00:00:25 |

|  51 |                      UNION-ALL                     |                    |       |       |    |       |          |

|* 52 |                       TABLE ACCESS FULL            | INQ_D住院医嘱长期列| 50784 |   495K|    |   823   (1)| 00:00:10 |

|* 53 |                       VIEW                         | index$_join$_013   | 97026 |   947K|    |  1220 (1)| 00:00:15 |

|* 54 |                        HASH JOIN                   |                    |       |       |    |       |          |

|  55 |                         INLIST ITERATOR            |                    |       |       |    |       |          |

|* 56 |                          INDEX RANGE SCAN          | IDX_108178_医嘱状态| 97026 |   947K|    |   191  (1)| 00:00:03 |

|  57 |                         INDEX FAST FULL SCAN       | IDX_108178_婴儿住院| 97026 |   947K|    |   724   (1)| 00:00:09 |

|  58 |                NESTED LOOPS OUTER                  |                    |   429 |   208K|    |    27  (4)| 00:00:01 |

|  59 |                 NESTED LOOPS                       |                    |   429 |   203K|    |    26  (4)| 00:00:01 |

|  60 |                  TABLE ACCESS BY INDEX ROWID       | DOC_T机构列表      |     1 |    16 |    |     1  (0)| 00:00:01 |

|* 61 |                   INDEX UNIQUE SCAN                | PK_T机构列表       |     1 |       |    |     0  (0)| 00:00:01 |

|  62 |                  VIEW                              |                    |   429 |   196K|    |    25  (4)| 00:00:01 |

|  63 |                   UNION-ALL                        |                    |       |       |    |       |          |

|* 64 |                    TABLE ACCESS FULL               | INQ_D住院档案      |   404 |   141K|    |    11  (0)| 00:00:01 |

|  65 |                    MERGE JOIN                      |                    |    25 |  9625 |    |    14  (8)| 00:00:01 |

|  66 |                     TABLE ACCESS BY INDEX ROWID    | INQ_D住院新生儿列表|    25 |   850 |    |     2  (0)| 00:00:01 |

|  67 |                      INDEX FULL SCAN               | IDX_108170_住院序号|    25 |       |    |     1  (0)| 00:00:01 |

|* 68 |                     SORT JOIN                      |                    |   404 |   138K|    |    12  (9)| 00:00:01 |

|* 69 |                      TABLE ACCESS FULL             | INQ_D住院档案      |   404 |   138K|    |    11  (0)| 00:00:01 |

|  70 |                 TABLE ACCESS BY INDEX ROWID        | DOC_B护理级别      |     1 |    12 |    |     1  (0)| 00:00:01 |

|* 71 |                  INDEX UNIQUE SCAN                 | PK_B护理级别       |     1 |       |    |     0  (0)| 00:00:01 |

|  72 |               VIEW                                 | index$_join$_005   |   101K|   694K|    |   649  (1)| 00:00:08 |

|* 73 |                HASH JOIN                           |                    |       |       |    |       |          |

|  74 |                 INDEX FAST FULL SCAN               | IDX_108174_婴儿序号|   101K|   694K|    |   235  (1)| 00:00:03 |

|  75 |                 INDEX FAST FULL SCAN               | IDX_108174_住院序号|   101K|   694K|    |   268   (0)| 00:00:04 |

|  76 |              INDEX FAST FULL SCAN                  | IDX_108178_婴儿住院|   242K|  1658K|    |   158   (1)| 00:00:02 |

---------------------------------------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   4 - access("U"."系统序号"(+)="A"."责任护士R")

   6 - access("V"."系统序号"(+)="A"."主管医师R")

   8 - access("R"."系统序号"(+)="A"."当前科室I")

  10 - access("C"."系统序号"(+)="A"."性别I")

  12 - access("Q"."系统序号"(+)="A"."病区序号I")

  14 - access("S"."系统序号"(+)="A"."当前床位I")

  16 - access("I"."系统序号"(+)="A"."病员费别I")

  18 - access("H"."系统序号"(+)="A"."病员类型I")

  20 - access("A"."婴儿序号I"="B"."婴儿序号I"(+) AND "A"."系统序号"="B"."住院序号I"(+))

  21 - access("A"."婴儿序号I"="C"."婴儿序号I"(+) AND "A"."系统序号"="C"."住院序号I"(+))

  22 - access("A"."婴儿序号I"="C"."婴儿序号I"(+) AND "A"."系统序号"="C"."系统序号"(+))

  24 - filter(NVL("A"."待审核医嘱数量",0)>0 OR NVL("C"."待执次数",0)>0 OR NVL("A"."待停止医嘱数量",0)>0)

  25 - access("A"."婴儿序号I"(+)="A"."婴儿序号I" AND "A"."住院序号I"(+)="A"."系统序号")

  26 - access("C"."婴儿序号I"(+)="A"."婴儿序号I" AND "C"."住院序号I"(+)="A"."系统序号")

  31 - access(ROWID=ROWID)

  36 - filter(CASE "A"."医嘱类型" WHEN U'\4E34\65F6' THEN "D"."医嘱类别" ELSE "E"."医嘱类别" END <>U'\68C0\67E5' AND CASE "A"."医嘱类型"

              WHEN U'\4E34\65F6' THEN "D"."医嘱类别" ELSE "E"."医嘱类别" END <>U'\68C0\9A8C')

  39 - access("A"."系统序号"="B"."单据序号I"(+))

  40 - filter("A"."医嘱类型"=U'\4E34\65F6' AND TRUNC(CASE "A"."医嘱类型" WHEN U'\957F\671F' THEN NVL("A"."停止时间",SYSDATE@!) ELSE

              "A"."停止时间" END )=TRUNC(SYSDATE@!+1) OR ("A"."医嘱类型"=U'\957F\671F' AND

              TO_DATE(TO_CHAR(INTERNAL_FUNCTION("A"."停止时间"),'yyyy-mm-dd hh24:mi'),'yyyy-mm-dd hh24:mi')>=SYSDATE@! OR

              TO_CHAR(INTERNAL_FUNCTION("A"."停止时间"),'yyyy-mm-dd hh24:mi') IS NULL AND TRUNC(CASE "A"."医嘱类型" WHEN U'\957F\671F' THEN

              NVL("A"."停止时间",SYSDATE@!) ELSE "A"."停止时间" END )=TRUNC(SYSDATE@!)) AND

              TRUNC(INTERNAL_FUNCTION("A"."起始时间"))<=TRUNC(SYSDATE@!))

  43 - filter("标志N">0 AND TRUNC(INTERNAL_FUNCTION("生成时间"))=TRUNC(SYSDATE@!))

  45 - access("A"."医嘱业务序号"="E"."系统序号"(+))

       filter("A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN "E"."系统序号"(+) IS NOT NULL THEN '长期' ELSE '长期' END ))

  47 - access("A"."医嘱业务序号"="D"."系统序号"(+))

       filter("A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN "D"."系统序号"(+) IS NOT NULL THEN '临时' ELSE '临时' END ))

  52 - filter("医嘱状态N"=1 OR "医嘱状态N"=2 OR "医嘱状态N"=5)

  53 - filter("医嘱状态N"=1 OR "医嘱状态N"=2)

  54 - access(ROWID=ROWID)

  56 - access("医嘱状态N"=1 OR "医嘱状态N"=2)

  61 - access("B"."系统序号"=72)

  64 - filter("A"."状态N"<4 AND "A"."隶属机构I"=72)

  68 - access("B"."住院序号I"="A"."系统序号")

       filter("B"."住院序号I"="A"."系统序号")

  69 - filter("A"."状态N"<4 AND "A"."隶属机构I"=72)

  71 - access("P"."系统序号"(+)="A"."护理级别I")

  73 - access(ROWID=ROWID)

 

inq_vd住院医嘱_执行情况_ 视图中

语句不够高效:

Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱长期列表 Where 医嘱状n=1 or 医嘱状态n=2 or 医嘱状态n=5

 Union All

 Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱临时列表 Where 医嘱状态n=1 or 医嘱状态n=2

 

执行计划

----------------------------------------------------------

Plan hash value: 3319122740

 

--------------------------------------------------------------------------------------

| Id  | Operation               | Name                  | Rows  | Bytes | Cost (%CPU)| Time

------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT        |                       |   121K|  1183K|  1903   (1)| 00:00:23

|   1 |  UNION-ALL              |                       |       |       |            |

|*  2 |   TABLE ACCESS FULL     | INQ_D住院医嘱长期列表 | 51546 |   503K|  1028   (1)| 00:00:13

|*  3 |   VIEW                  | index$_join$_002      | 69680 |   680K|   875   (1)| 00:00:11

|*  4 |    HASH JOIN            |                       |       |       |            |

|   5 |     INLIST ITERATOR     |                       |       |       |            |

|*  6 |      INDEX RANGE SCAN   | IDX_94513_医嘱状态N   | 69680 |   680K|   137   (1)| 00:00:02

|   7 |     INDEX FAST FULL SCAN| IDX_94513_婴儿序号I_住| 69680 |   680K|   519   (1)| 00:00:07

------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   2 - filter("医嘱状态N"=1 OR "医嘱状态N"=2 OR "医嘱状态N"=5)

   3 - filter("医嘱状态N"=1 OR "医嘱状态N"=2)

   4 - access(ROWID=ROWID)

   6 - access("医嘱状态N"=1 OR "医嘱状态N"=2)

 

 

统计信息

----------------------------------------------------------

          1  recursive calls

          0  db block gets

       3501  consistent gets

       3010  physical reads

          0  redo size

      13826  bytes sent via SQL*Net to client

       1036  bytes received via SQL*Net from client

         49  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

        717  rows processed

 

需消耗3501一致读 和3010 物理读

 

 

创建索引 create index  IDX_94509_医嘱状态N on INQ_D住院医嘱长期列表(医嘱状态N)

并等价改写SQL为

Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱长期列表 Where 医嘱状n=1 Union All

Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱长期列表 Where 医嘱状n=2

Union All

Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱长期列表 Where 医嘱状n=5

Union All

Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱临时列表 Where 医嘱状n=1

Union All

Select 住院序号i,医嘱状态n,婴儿序号I From INQ_D住院医嘱临时列表 Where 医嘱状n=2

 

Plan hash value: 3812170031

 

------------------------------------------------------------------------------------------------------

| Id  | Operation                    | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |                       |   121K|  1183K|  2751   (1)| 00:00:34 |

|   1 |  UNION-ALL                   |                       |       |       |            |          |

|   2 |   TABLE ACCESS BY INDEX ROWID| INQ_D住院医嘱长期列表 | 17182 |   167K|   595   (1)| 00:00:08 |

|*  3 |    INDEX RANGE SCAN          | IDX_94509_医嘱状态N   | 17182 |       |    34   (0)| 00:00:01 |

|   4 |   TABLE ACCESS BY INDEX ROWID| INQ_D住院医嘱长期列表 | 17182 |   167K|   595   (1)| 00:00:08 |

|*  5 |    INDEX RANGE SCAN          | IDX_94509_医嘱状态N   | 17182 |       |    34   (0)| 00:00:01 |

|   6 |   TABLE ACCESS BY INDEX ROWID| INQ_D住院医嘱长期列表 | 17182 |   167K|   595   (1)| 00:00:08 |

|*  7 |    INDEX RANGE SCAN          | IDX_94509_医嘱状态N   | 17182 |       |    34   (0)| 00:00:01 |

|*  8 |   VIEW                       | index$_join$_004      | 34840 |   340K|   484   (1)| 00:00:06 |

|*  9 |    HASH JOIN                 |                       |       |       |            |          |

|* 10 |     INDEX RANGE SCAN         | IDX_94513_医嘱状态N   | 34840 |   340K|    68   (0)| 00:00:01 |

|  11 |     INDEX FAST FULL SCAN     | IDX_94513_婴儿序号I_住| 34840 |   340K|   519   (1)| 00:00:07 |

|* 12 |   VIEW                       | index$_join$_005      | 34840 |   340K|   484   (1)| 00:00:06 |

|* 13 |    HASH JOIN                 |                       |       |       |            |          |

|* 14 |     INDEX RANGE SCAN         | IDX_94513_医嘱状态N   | 34840 |   340K|    68   (0)| 00:00:01 |

|  15 |     INDEX FAST FULL SCAN     | IDX_94513_婴儿序号I_住| 34840 |   340K|   519   (1)| 00:00:07 |

------------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   3 - access("医嘱状态N"=1)

   5 - access("医嘱状态N"=2)

   7 - access("医嘱状态N"=5)

   8 - filter("医嘱状态N"=1)

   9 - access(ROWID=ROWID)

  10 - access("医嘱状态N"=1)

  12 - filter("医嘱状态N"=2)

  13 - access(ROWID=ROWID)

  14 - access("医嘱状态N"=2)

 

 

统计信息

----------------------------------------------------------

          1  recursive calls

          0  db block gets

        949  consistent gets

          0  physical reads

          0  redo size

      13713  bytes sent via SQL*Net to client

       1036  bytes received via SQL*Net from client

         49  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

        717  rows processed

逻辑读降为949 并且没有物理读

最后针对inq_vd住院医嘱执行单视图单独跑需要23分钟

优化前SQL:

 

create or replace view inq_vd住院医嘱执行单 as

select

      A.系统序号

      ,A.同步序号

      ,A.医嘱类型

      ,A.住院序号i

      ,A.婴儿序号i

      ,to_char(A.起始时间,'yyyy-mm-dd hh24:mi') as 起始时间

      ,to_char(A.停止时间,'yyyy-mm-dd hh24:mi') as 停止时间

      ,A.医嘱内容

      ,A.用法

      ,trunc(A.起始时间) as 起始日期

      ,trunc(case when A.医嘱类型='长期' then nvl(A.停止时间,sysdate) else A.停止时间 end) as 停止日期

      ,A.起始医生

      ,A.停止医生

      ,A.周期次数

      ,A.频率周期

      ,A.医嘱业务序号

      ,A.分组标识

      ,A.给药方式i,B.名称 as 给药方式

      ,B.其他名称 as 给药方式其他名称

      ,B.类型N as 给药方式类型n,B.类型 as 给药方式类型

      ,A.用药频率i,C.名称 as 用药频率

      ,(case when A.医嘱类型='临时' then D.医嘱类别 else E.医嘱类别 end) as 医嘱类别

      ,(case when A.医嘱类型='临时' then D.医嘱目录序号I else E.医嘱目录序号I end) as 医嘱目录序号I

      ,A.上次记账时间

      ,A.上次记账人R

      ,D.用药天数

      ,nvl(D.使用量,1)*nvl(C.频率数量,1)*nvl(D.用药天数,1) 临时用药总量

      ,nvl(E.使用量,1)*nvl(C.频率数量,1) 长期用药总量

      ,case when A.医嘱类型='临时' and D.术中医嘱B=1 then Translate('术中' USING NCHAR_CS)

        else A.医嘱类型 end 显示医嘱类型,a.隶属机构i

      ,Nvl(K1.名称,K2.名称) As 药房名称

from INQ_D住院医嘱执行单 A

      Left Join DOC_VT给药方式 B On A.给药方式I=B.系统序号

      Left Join DOC_T用药频率 C On A.用药频率I=C.系统序号

      Left Join Inq_d住院医嘱临时列表 D On A.医嘱业务序号=D.系统序号 And A.医嘱类型='临时'

      Left Join Inq_d住院医嘱长期列表 E On A.医嘱业务序号=E.系统序号 And A.医嘱类型='长期'

      Left Join DOC_T科室档案 K1 On K1.系统序号=D.药房序号I

      Left Join DOC_T科室档案 K2 On K2.系统序号=E.药房序号I;

 

已选择287822行。

 

已用时间:  00: 23: 45.00

执行计划

----------------------------------------------------------

Plan hash value: 2145745537

 

--------------------------------------------------------------------------------------------------

| Id  | Operation                | Name          | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |

--------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT         |               |   239K|    71M|       |  7030   (1)| 00:01:25 |

|*  1 |  HASH JOIN RIGHT OUTER   |               |   239K|    71M|       |  7030   (1)| 00:01:25 |

|   2 |   VIEW                   | DOC_VT给药方式|    94 | 14476 |       |     9  (12)| 00:00:01 |

|   3 |    SORT ORDER BY         |               |    94 |  6580 |       |     9  (12)| 00:00:01 |

|*  4 |     HASH JOIN OUTER      |               |    94 |  6580 |       |     8   (0)| 00:00:01 |

|   5 |      TABLE ACCESS FULL   | DOC_T给药方式 |    94 |  5546 |       |     3   (0)| 00:00:01 |

|   6 |      TABLE ACCESS FULL   | DOC_T员工档案 |   389 |  4279 |       |     5   (0)| 00:00:01 |

|*  7 |   HASH JOIN RIGHT OUTER  |               |   239K|    36M|       |  7020   (1)| 00:01:25 |

|   8 |    TABLE ACCESS FULL     | DOC_T用药频率 |    28 |   420 |       |     3   (0)| 00:00:01 |

|*  9 |    HASH JOIN RIGHT OUTER |               |   239K|    32M|  5616K|  7016   (1)| 00:01:25 |

|  10 |     TABLE ACCESS FULL    | INQ_D住院医嘱 |   174K|  3572K|       |  1405   (1)| 00:00:17 |

|* 11 |     HASH JOIN RIGHT OUTER|               |   239K|    28M|  3024K|  3805   (1)| 00:00:46 |

|  12 |      TABLE ACCESS FULL   | INQ_D住院医嘱 |   103K|  1812K|       |  1027   (1)| 00:00:13 |

|  13 |      TABLE ACCESS FULL   | INQ_D住院医嘱 |   239K|    24M|       |  1303   (1)| 00:00:16 |

--------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 - access("A"."给药方式I"="B"."系统序号"(+))

   4 - access("B"."系统序号"(+)="A"."操作人R")

   7 - access("A"."用药频率I"="C"."系统序号"(+))

   9 - access("A"."医嘱业务序号"="D"."系统序号"(+) AND "A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN

              "D"."系统序号"(+) IS NOT NULL THEN '临时' ELSE '临时' END ))

  11 - access("A"."医嘱业务序号"="E"."系统序号"(+) AND "A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN

              "E"."系统序号"(+) IS NOT NULL THEN '长期' ELSE '长期' END ))

 

 

统计信息

----------------------------------------------------------

          8  recursive calls

          0  db block gets

      27234  consistent gets

      11436  physical reads

          0  redo size

   24086217  bytes sent via SQL*Net to client

     176421  bytes received via SQL*Net from client

      15993  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

     239873  rows processed

 

使用并行优化后

 

Select /*+ parallel(A,4) parallel(D,4) parallel(E,4)*/

      A.系统序号

      ,A.同步序号

      ,A.医嘱类型

      ,A.住院序号i

      ,A.婴儿序号i

      ,to_char(A.起始时间,'yyyy-mm-dd hh24:mi') as 起始时间

      ,to_char(A.停止时间,'yyyy-mm-dd hh24:mi') as 停止时间

      ,A.医嘱内容

      ,A.用法

      ,trunc(A.起始时间) as 起始日期

      ,trunc(case when A.医嘱类型='长期' then nvl(A.停止时间,sysdate) else A.停止时间 end) as 停止日期

      ,A.起始医生

      ,A.停止医生

      ,A.周期次数

      ,A.频率周期

      ,A.医嘱业务序号

      ,A.分组标识

      ,A.给药方式i,B.名称 as 给药方式

      ,B.其他名称 as 给药方式其他名称

      ,B.类型N as 给药方式类型n,B.类型 as 给药方式类型

      ,A.用药频率i,C.名称 as 用药频率

      ,(case when A.医嘱类型='临时' then D.医嘱类别 else E.医嘱类别 end) as 医嘱类别

      ,(case when A.医嘱类型='临时' then D.医嘱目录序号I else E.医嘱目录序号I end) as 医嘱目录序号I

      ,A.上次记账时间

      ,A.上次记账人R

      ,D.用药天数

      ,nvl(D.使用量,1)*nvl(C.频率数量,1)*nvl(D.用药天数,1) 临时用药总量

      ,nvl(E.使用量,1)*nvl(C.频率数量,1) 长期用药总量

      ,case when A.医嘱类型='临时' and D.术中医嘱B=1 then Translate('术中' USING NCHAR_CS)

        else A.医嘱类型 end 显示医嘱类型,a.隶属机构i

      ,Nvl(K1.名称,K2.名称) As 药房名称

from INQ_D住院医嘱执行单 A

      Left Join DOC_VT给药方式 B On A.给药方式I=B.系统序号

      Left Join DOC_T用药频率 C On A.用药频率I=C.系统序号

      Left Join Inq_d住院医嘱临时列表 D On A.医嘱业务序号=D.系统序号 And A.医嘱类型='临时'

      Left Join Inq_d住院医嘱长期列表 E On A.医嘱业务序号=E.系统序号 And A.医嘱类型='长期'

      Left Join DOC_T科室档案 K1 On K1.系统序号=D.药房序号I

      Left Join DOC_T科室档案 K2 On K2.系统序号=E.药房序号I;

 

已选择287822行。

 

Plan hash value: 3163350351

 

--------------------------------------------------------------------------------------------------------------------------

| Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time     |    TQ  |IN-OUT| PQ Distrib

--------------------------------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |               |   239K|    71M|  1050   (1)| 00:00:13 |        |      |

|   1 |  PX COORDINATOR              |               |       |       |            |          |        |      |

|   2 |   PX SEND QC (RANDOM)        | :TQ10004      |   239K|    71M|  1050   (1)| 00:00:13 |  Q1,04 | P->S | QC (RAND)

|*  3 |    HASH JOIN RIGHT OUTER     |               |   239K|    71M|  1050   (1)| 00:00:13 |  Q1,04 | PCWP |

|   4 |     PX RECEIVE               |               |   103K|  1812K|   285   (0)| 00:00:04 |  Q1,04 | PCWP |

|   5 |      PX SEND BROADCAST       | :TQ10002      |   103K|  1812K|   285   (0)| 00:00:04 |  Q1,02 | P->P | BROADCAST

|   6 |       PX BLOCK ITERATOR      |               |   103K|  1812K|   285   (0)| 00:00:04 |  Q1,02 | PCWC |

|   7 |        TABLE ACCESS FULL     | INQ_D住院医嘱 |   103K|  1812K|   285   (0)| 00:00:04 |  Q1,02 | PCWP |

|*  8 |     HASH JOIN RIGHT OUTER    |               |   239K|    67M|   765   (1)| 00:00:10 |  Q1,04 | PCWP |

|   9 |      PX RECEIVE              |               |   174K|  3572K|   390   (1)| 00:00:05 |  Q1,04 | PCWP |

|  10 |       PX SEND BROADCAST      | :TQ10003      |   174K|  3572K|   390   (1)| 00:00:05 |  Q1,03 | P->P | BROADCAST

|  11 |        PX BLOCK ITERATOR     |               |   174K|  3572K|   390   (1)| 00:00:05 |  Q1,03 | PCWC |

|  12 |         TABLE ACCESS FULL    | INQ_D住院医嘱 |   174K|  3572K|   390   (1)| 00:00:05 |  Q1,03 | PCWP |

|* 13 |      HASH JOIN RIGHT OUTER   |               |   239K|    62M|   374   (1)| 00:00:05 |  Q1,04 | PCWP |

|  14 |       BUFFER SORT            |               |       |       |            |          |  Q1,04 | PCWC |

|  15 |        PX RECEIVE            |               |    94 | 14476 |     9  (12)| 00:00:01 |  Q1,04 | PCWP |

|  16 |         PX SEND BROADCAST    | :TQ10000      |    94 | 14476 |     9  (12)| 00:00:01 |        | S->P | BROADCAST

|  17 |          VIEW                | DOC_VT给药方式|    94 | 14476 |     9  (12)| 00:00:01 |        |      |

|  18 |           SORT ORDER BY      |               |    94 |  6580 |     9  (12)| 00:00:01 |        |      |

|* 19 |            HASH JOIN OUTER   |               |    94 |  6580 |     8   (0)| 00:00:01 |        |      |

|  20 |             TABLE ACCESS FULL| DOC_T给药方式 |    94 |  5546 |     3   (0)| 00:00:01 |        |      |

|  21 |             TABLE ACCESS FULL| DOC_T员工档案 |   389 |  4279 |     5   (0)| 00:00:01 |        |      |

|* 22 |       HASH JOIN RIGHT OUTER  |               |   239K|    27M|   365   (1)| 00:00:05 |  Q1,04 | PCWP |

|  23 |        BUFFER SORT           |               |       |       |            |          |  Q1,04 | PCWC |

|  24 |         PX RECEIVE           |               |    28 |   420 |     3   (0)| 00:00:01 |  Q1,04 | PCWP |

|  25 |          PX SEND BROADCAST   | :TQ10001      |    28 |   420 |     3   (0)| 00:00:01 |        | S->P | BROADCAST

|  26 |           TABLE ACCESS FULL  | DOC_T用药频率 |    28 |   420 |     3   (0)| 00:00:01 |        |      |

|  27 |        PX BLOCK ITERATOR     |               |   239K|    24M|   362   (1)| 00:00:05 |  Q1,04 | PCWC |

|  28 |         TABLE ACCESS FULL    | INQ_D住院医嘱 |   239K|    24M|   362   (1)| 00:00:05 |  Q1,04 | PCWP |

--------------------------------------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   3 - access("A"."医嘱业务序号"="E"."系统序号"(+) AND "A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN "E"."系统序号"(+) IS NOT NULL

              ELSE '长期' END ))

   8 - access("A"."医嘱业务序号"="D"."系统序号"(+) AND "A"."医嘱类型"=SYS_OP_C2C(CASE  WHEN "D"."系统序号"(+) IS NOT NULL

              ELSE '临时' END ))

  13 - access("A"."给药方式I"="B"."系统序号"(+))

  19 - access("B"."系统序号"(+)="A"."操作人R")

  22 - access("A"."用药频率I"="C"."系统序号"(+))

 

已选择46行。

 

已用时间:  00: 00: 00.12

 

用时只需00: 00: 00.12

 

最终sql不到4s 跑完
 

猜你喜欢

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