当前位置: 代码迷 >> Oracle开发 >> plsql中执行计划-暂时空间
  详细解决方案

plsql中执行计划-暂时空间

热度:18   发布时间:2016-04-24 07:23:52.0
plsql中执行计划-临时空间
SQL code
SELECT              cli_id,             co_id,             rel_sys_id,             rel_sys_ref_id,             rel_typ_cd,             MAX(INSERTDATE) INSERTDATE        FROM KPIODS.ODS_TRL_ING B        WHERE B.INSERTDATE < DATE'2012-8-7'         AND [b]cli_id || co_id || rel_sys_id || rel_sys_ref_id || rel_typ_cd IN             (SELECT cli_id || co_id || rel_sys_id || rel_sys_ref_id ||                     rel_typ_cd[/b]                FROM KPIODS.ODS_TRL_ING B                WHERE B.INSERTDATE >=DATE'2012-8-7'                 and B.INSERTDATE <= DATE'2012-8-8')       GROUP BY cli_id, co_id, rel_sys_id, rel_sys_ref_id, rel_typ_cd


SQL code
SELECT STATEMENT, GOAL = ALL_ROWS            6633362    339223431    28494768204    575484025529    6607856     HASH GROUP BY            6633362    339223431    28494768204    575484025529    6607856    [color=#FF0000]34307646000[/color]  HASH JOIN            14752    339223431    28494768204    37019067111    13111       TABLE ACCESS BY INDEX ROWID    KPIODS    ODS_TRL_ING    66    4596    193032    2778275    66        INDEX RANGE SCAN    KPIODS    IDX_TRL_INSERTDATE    15    4525        1012022    15       TABLE ACCESS FULL    KPIODS    ODS_TRL_ING    13182    7381513    310023546    3081974783    13045    


问题1:如上sql执行计划中,临时空间 为:34307646000,这个临时空间,在sql执行时是占用的内存吗?单位是什么
我将上边黑体的部分,做了如下修改:
SQL code
SELECT              cli_id,             co_id,             rel_sys_id,             rel_sys_ref_id,             rel_typ_cd,             MAX(INSERTDATE) INSERTDATE        FROM KPIODS.ODS_TRL_ING B        WHERE B.INSERTDATE < DATE'2012-8-7'         AND cli_id /*|| co_id || rel_sys_id || rel_sys_ref_id || rel_typ_cd*/ IN             (SELECT cli_id || co_id || rel_sys_id || rel_sys_ref_id ||                     rel_typ_cd                FROM KPIODS.ODS_TRL_ING B                WHERE B.INSERTDATE >=DATE'2012-8-7'                 and B.INSERTDATE <= DATE'2012-8-8')       GROUP BY cli_id, co_id, rel_sys_id, rel_sys_ref_id, rel_typ_cd


SQL code
SELECT STATEMENT, GOAL = ALL_ROWS            14472    60920    5117280    3920002183    14298     HASH GROUP BY            14472    60920    5117280    3920002183    14298    [color=#FF0000]6177000[/color]  HASH JOIN            13281    60920    5117280    3834875311    13111       TABLE ACCESS BY INDEX ROWID    KPIODS    ODS_TRL_ING    66    4596    193032    2778275    66        INDEX RANGE SCAN    KPIODS    IDX_TRL_INSERTDATE    15    4525        1012022    15       TABLE ACCESS FULL    KPIODS    ODS_TRL_ING    13182    7381513    310023546    3081974783    13045

问题2:临时空间,就减少至 6177000,我查过了cli_id || co_id || rel_sys_id || rel_sys_ref_id ||rel_typ_cd,并到一起的最大长度是31个字符。也不是很大,为什么会差这么多临时空间?

------解决方案--------------------
字符串拼接动作会导致索引失效(除非你弄个字段存拼接后的值,然后在这个字段上建索引)
你的sql如下改造
同时在 (CLI_ID, CO_ID, REL_SYS_ID, REL_SYS_REF_ID, REL_TYP_CD) 上建一个组合索引
SQL code
SELECT CLI_ID,       CO_ID,       REL_SYS_ID,       REL_SYS_REF_ID,       REL_TYP_CD,       MAX(INSERTDATE) INSERTDATE  FROM KPIODS.ODS_TRL_ING B WHERE B.INSERTDATE < DATE '2012-8-7'   AND (CLI_ID, CO_ID, REL_SYS_ID, REL_SYS_REF_ID, REL_TYP_CD) IN       (SELECT CLI_ID, CO_ID, REL_SYS_ID, REL_SYS_REF_ID, REL_TYP_CD          FROM KPIODS.ODS_TRL_ING B         WHERE B.INSERTDATE >= DATE '2012-8-7'           AND B.INSERTDATE <= DATE '2012-8-8') GROUP BY CLI_ID, CO_ID, REL_SYS_ID, REL_SYS_REF_ID, REL_TYP_CD
  相关解决方案