【问题标题】:View performance vs WITH performance查看性能与 WITH 性能
【发布时间】:2018-12-03 23:13:06
【问题描述】:

我有一个从视图和更多表中进行选择的查询。

当我“按原样”执行此查询时 - 性能非常糟糕。

当我获取视图的查询并将其添加到带有WITH CLAUSE 的外部查询时,它运行得非常快。

我的测试表明问题不在于视图的查询本身,而在于优化器将视图数据与其他数据连接的方式。

这个问题的解释是什么?

由于 30K 字符的限制,选择查询中缺少一些字段..

--View:
CREATE OR REPLACE VIEW DWH.CC_MC_VIEW AS
SELECT /*+ full(E) */
DISTINCT/* a lot of fields */
FROM dwh.t2002_merkazei_tamhir_cur a
LEFT JOIN dwh.allovdim b
ON a.oved_achrai_char = TO_CHAR(b.mis_oved)
AND a.company         = b.company
LEFT JOIN dwh.t2003_kodei_merkazei_tamhir h
ON h.year     = TO_CHAR(SYSDATE-28,'yyyy')
AND h.erech   = a.c01_agaf
AND h.company = A.company
AND h.amuda   = '01'
LEFT JOIN dwh.t2003_kodei_merkazei_tamhir g
ON g.erech    = a.c03_minhal_rb
AND g.amuda   = '03'
AND g.year    = TO_CHAR(SYSDATE-28,'yyyy')
AND g.company = A.company
LEFT JOIN DWH_COMPANIES E
ON A.COMPANY = E.COM_COMPANY_CODE
LEFT JOIN dwh.t2003_kodei_merkazei_tamhir d
ON d.erech    = a.c02_minhalhativa
AND d.amuda   = '02'
AND D.year    = TO_CHAR(SYSDATE-28,'yyyy')
AND A.COMPANY = D.COMPANY
LEFT JOIN dwh.allovdim c
ON d.oved_achrai = c.mis_oved
AND d.company    = c.company
LEFT JOIN DWH_COMPANIES F
ON D.COMPANY    = F.COM_COMPANY_CODE
WHERE KOD_SGIRA = 1;

视图查询(性能不佳)

(SELECT  ROUND(dwh.plm_docdelivery.RELEASEDDATE-dwh.plm_docdelivery.PROCESSSTARTDATE),
ROUND(sysdate         -dwh.plm_docdelivery.PROCESSSTARTDATE),
dwh.plm_docdelivery.*,
dwh.cc_mc_view.*,
dwh.plm_programs.*,
FROM    dwh.plm_docdelivery,
DWH.PLM_PROGRAMS,
dwh.cc_mc_view,
dwh.allovdim ENG_OWNER,
dwh.plm_last_rev
WHERE
(
dwh.plm_docdelivery.PROGRAMNUMBER=dwh.plm_programs.PROGRAMNUMBER
AND dwh.plm_docdelivery.COMPANY=dwh.plm_programs.COMPANY
AND dwh.plm_docdelivery.LOGISTICCOMPANY=dwh.plm_programs.LOGISTICCOMPANY
)
AND
(
dwh.plm_docdelivery.ENGOWNERID= ENG_OWNER.EMP_ID(+)
)
AND
(
dwh.cc_mc_view.MERKAZ_TAMHIR(+)=ENG_OWNER.MIS_TAMH
AND dwh.cc_mc_view.COMPANY(+)  =ENG_OWNER.COMPANY
)
AND
(
dwh.plm_last_rev.COMPANY=dwh.plm_docdelivery.COMPANY
AND dwh.plm_last_rev.LOGISTICCOMPANY=dwh.plm_docdelivery.LOGISTICCOMPANY
AND dwh.plm_last_rev.PROGRAMNUMBER=dwh.plm_docdelivery.PROGRAMNUMBER
AND dwh.plm_last_rev.DOCUMENT=dwh.plm_docdelivery.DOCUMENT
)
AND
(ENG_OWNER.COMPANY<>'SOL')
AND
(dwh.plm_docdelivery.PROGRAMNUMBER IN ('X395','X419','X422','X379','X454','X372','X308', 'X394','X426','X433','X423','X391','X391A','X393','X490','X510','X460','X466A','X466B', 'X466C','X448','T622','T610','X461','X470','X520','X436','X560','D308','X922B','X922','X435', 'X494','X402','X995SP','X493','X481','X990','T799')
AND
(dwh.plm_docdelivery.CDRLTYPE    <> 'SDRL'
OR dwh.plm_docdelivery.CDRLTYPE IS NULL)
AND dwh.plm_last_rev.LAST_REV = dwh.plm_docdelivery.DOCUMENTREVISION
AND((dwh.plm_docdelivery.AUTHORDATE <= '16-07-2017 00:00:00'
AND(dwh.plm_docdelivery.STATUS    IN ( '(Freeze)','(Released)' )
OR dwh.plm_docdelivery.STATUS IS NULL))
OR dwh.plm_docdelivery.RELEASEDDATE IS NOT NULL)
AND dwh.plm_programs.COMPANY IN ('ESL','TCL'))
MINUS
SELECT  ROUND(dwh.plm_docdelivery.RELEASEDDATE-dwh.plm_docdelivery.PROCESSSTARTDATE),
ROUND(sysdate         -dwh.plm_docdelivery.PROCESSSTARTDATE),
dwh.plm_docdelivery.STATUS,
dwh.plm_docdelivery.SIGNERSLEFT,
dwh.plm_docdelivery.RELEASEDDATE,
dwh.plm_docdelivery.PROGRAMNUMBER,
dwh.plm_programs.PROGRAMNAME,
dwh.cc_mc_view.MINHALHATIVA,
TO_CHAR(dwh.plm_docdelivery.PLANNEDVALUE)
||
dwh.plm_docdelivery.TIMEUNIT
||
' '
||
CASE
WHEN dwh.plm_docdelivery.PLANNEDRELATION='After'
THEN '+'
WHEN dwh.plm_docdelivery.PLANNEDRELATION='Before'
THEN '-'
ELSE ''
END
||
dwh.plm_docdelivery.CDRLGATENAME,
ENG_OWNER.MISHPAHA,
ENG_OWNER.MISHPAHA_ENG,
ENG_OWNER.PRATI,
ENG_OWNER.PRATI_ENG,
dwh.plm_docdelivery.ENGOWNERID,
dwh.plm_docdelivery.ENGDISCIPLINE,
dwh.cc_mc_view.ACHRAI_HATIVA_NAME,
dwh.cc_mc_view.OVED_ACHRAI_HATIVA_FULL,
dwh.cc_mc_view.ACHRAI_MT_NAME,
dwh.cc_mc_view.OVED_ACHRAI_MT_FULL,
dwh.plm_docdelivery.DOCUMENTREVISION,
dwh.plm_docdelivery.DOCUMENTNAME,
dwh.plm_docdelivery.DOCUMENT,
dwh.plm_docdelivery.DELIVERY,
dwh.plm_docdelivery.CURRENTUSER ,
dwh.cc_mc_view.MERKAZ_TAMHIR,
dwh.plm_docdelivery.CDRLTYPE,
dwh.plm_docdelivery.CDRL,
dwh.plm_docdelivery.AUTHORDATE,
dwh.plm_docdelivery.DOC_REV_CREATION_DATE,
dwh.plm_docdelivery.DELIVERY_CREATION_DATE,
dwh.plm_docdelivery.GATEORIGINALDATE,
dwh.plm_programs.STATUS_DATE,
dwh.plm_docdelivery.ProcedureName,
dwh.plm_last_rev.LAST_REV,
dwh.plm_programs.COMPANY
FROM    dwh.plm_docdelivery,
DWH.PLM_PROGRAMS,
dwh.cc_mc_view,
dwh.allovdim ENG_OWNER,
dwh.plm_last_rev
WHERE
(dwh.plm_docdelivery.PROGRAMNUMBER      =dwh.plm_programs.PROGRAMNUMBER
AND dwh.plm_docdelivery.COMPANY        =dwh.plm_programs.COMPANY
AND dwh.plm_docdelivery.LOGISTICCOMPANY=dwh.plm_programs.LOGISTICCOMPANY)
AND
(dwh.plm_docdelivery.ENGOWNERID= ENG_OWNER.EMP_ID(+))
AND
(dwh.cc_mc_view.MERKAZ_TAMHIR(+)=ENG_OWNER.MIS_TAMH
AND dwh.cc_mc_view.COMPANY(+)  =ENG_OWNER.COMPANY)
AND
(dwh.plm_last_rev.COMPANY            =dwh.plm_docdelivery.COMPANY
AND dwh.plm_last_rev.LOGISTICCOMPANY=dwh.plm_docdelivery.LOGISTICCOMPANY
AND dwh.plm_last_rev.PROGRAMNUMBER  =dwh.plm_docdelivery.PROGRAMNUMBER
AND dwh.plm_last_rev.DOCUMENT       =dwh.plm_docdelivery.DOCUMENT)
AND
(ENG_OWNER.COMPANY<>'SOL')
AND
(dwh.plm_docdelivery.PROGRAMNUMBER IN ('X395','X419','X422','X379','X454','X372','X308', 'X394','X426','X433','X423','X391','X391A','X393','X490','X510','X460','X466A','X466B', 'X466C','X448','T622','T610','X461','X470','X520','X436','X560','D308','X922B','X922','X435', 'X494','X402','X995SP','X493','X481','X990','T799')
AND dwh.plm_docdelivery.DELIVERY  IS NOT NULL
AND dwh.plm_docdelivery.DOCUMENT  IS NULL
AND dwh.plm_programs.COMPANY      IN ('CMP1','CMP2')))

解释视图的计划(性能不佳)

Plan hash value: 822592127

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

| Id  | Operation| Name         | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT         |              |    57 | 52896 | 32848   (2)| 00:01:39 |
|   1 |  MINUS   |              |       |       |            |          |
|   2 |   SORT UNIQUE            |              |    57 | 26448 | 16424   (2)| 00:00:50 |
|   3 |    NESTED LOOPS OUTER    |              |    57 | 26448 | 16423   (2)| 00:00:50 |
|   4 |     NESTED LOOPS         |              |    20 |  5540 | 14146   (3)| 00:00:43 |
|*  5 |      HASH JOIN           |              |    20 |  4660 | 14106   (3)| 00:00:43 |
|*  6 |       TABLE ACCESS FULL  | PLM_LAST_REV |    50 |  1300 | 13959   (3)| 00:00:42 |
|   7 |       NESTED LOOPS       |              |   798 |   161K|   147   (2)| 00:00:01 |
|   8 |        NESTED LOOPS      |              |   798 |   161K|   147   (2)| 00:00:01 |
|*  9 |         TABLE ACCESS FULL| PLM_PROGRAMS |    44 |  1496 |    14   (8)| 00:00:01 |
|* 10 |         INDEX RANGE SCAN | IDX_DELIVERY_1               |     1 |       |     2   (0)| 00:00:01 |
|* 11 |        TABLE ACCESS BY INDEX ROWID       | PLM_DOCDELIVERY              |    18 |  3114 |     3   (0)| 00:00:01 |
|  12 |      TABLE ACCESS BY INDEX ROWID         | ALLOVDIM     |     1 |    44 |     2   (0)| 00:00:01 |
|* 13 |       INDEX RANGE SCAN   | ALLOVDIM_I_EMP_CMP           |     1 |       |     1   (0)| 00:00:01 |
|  14 |     VIEW PUSHED PREDICATE| CC_MC_VIEW   |     1 |   187 |   114   (2)| 00:00:01 |
|  15 |      SORT UNIQUE         |              |     1 |   217 |   114   (2)| 00:00:01 |
|* 16 |       FILTER             |              |       |       |            |          |
|  17 |        NESTED LOOPS OUTER|              |     1 |   217 |   113   (1)| 00:00:01 |
|  18 |         NESTED LOOPS OUTER               |              |     1 |   173 |    97   (2)| 00:00:01 |
|* 19 |          HASH JOIN OUTER |              |     1 |   167 |    96   (2)| 00:00:01 |
|  20 |           NESTED LOOPS OUTER             |              |     1 |   161 |    48   (0)| 00:00:01 |
|  21 |            NESTED LOOPS OUTER            |              |     1 |   117 |    46   (0)| 00:00:01 |
|  22 |             NESTED LOOPS OUTER           |              |     1 |    90 |    32   (0)| 00:00:01 |
|  23 |              NESTED LOOPS OUTER          |              |     1 |    65 |    18   (0)| 00:00:01 |
|* 24 |               TABLE ACCESS BY INDEX ROWID| T2002_MERKAZEI_TAMHIR_CUR    |     1 |    40 |     4   (0)| 00:00:01 |
|* 25 |INDEX RANGE SCAN          | T2002_MERKAZEI_TAMHIR_CUR_I1 |     3 |       |     1   (0)| 00:00:01 |
|  26 |               TABLE ACCESS BY INDEX ROWID| T2003_KODEI_MERKAZEI_TAMHIR  |     1 |    25 |    14   (0)| 00:00:01 |
|* 27 |INDEX RANGE SCAN          | T2003_K_MT97_Y_AE_I          |     1 |       |    13   (0)| 00:00:01 |
|  28 |              TABLE ACCESS BY INDEX ROWID | T2003_KODEI_MERKAZEI_TAMHIR  |     1 |    25 |    14   (0)| 00:00:01 |
|* 29 |               INDEX RANGE SCAN           | T2003_K_MT97_Y_AE_I          |     1 |       |    13   (0)| 00:00:01 |
|  30 |             TABLE ACCESS BY INDEX ROWID  | T2003_KODEI_MERKAZEI_TAMHIR  |     1 |    27 |    14   (0)| 00:00:01 |
|* 31 |              INDEX RANGE SCAN            | T2003_K_MT97_Y_AE_I          |     1 |       |    13   (0)| 00:00:01 |
|  32 |            TABLE ACCESS BY INDEX ROWID   | ALLOVDIM     |     1 |    44 |     2   (0)| 00:00:01 |
|* 33 |             INDEX RANGE SCAN             | ALLOVDIM_I_CMP_MIS           |     1 |       |     1   (0)| 00:00:01 |
|* 34 |           TABLE ACCESS FULL              | DWH_COMPANIES|     1 |     6 |    47   (0)| 00:00:01 |
|  35 |          TABLE ACCESS BY INDEX ROWID     | DWH_COMPANIES|     1 |     6 |     1   (0)| 00:00:01 |
|* 36 |           INDEX UNIQUE SCAN              | COMP_IDX1    |     1 |       |     0   (0)| 00:00:01 |
|  37 |         TABLE ACCESS BY INDEX ROWID      | ALLOVDIM     |     1 |    44 |    16   (0)| 00:00:01 |
|* 38 |          INDEX RANGE SCAN| ALLOVDIM_I_CMP_MIS           |     1 |       |    15   (0)| 00:00:01 |
|  39 |   SORT UNIQUE            |              |    57 | 26448 | 16424   (2)| 00:00:50 |
|  40 |    NESTED LOOPS OUTER    |              |    57 | 26448 | 16423   (2)| 00:00:50 |
|  41 |     NESTED LOOPS         |              |    20 |  5540 | 14145   (3)| 00:00:43 |
|* 42 |      HASH JOIN           |              |    20 |  4660 | 14105   (3)| 00:00:43 |
|* 43 |       TABLE ACCESS FULL  | PLM_LAST_REV |    50 |  1300 | 13959   (3)| 00:00:42 |
|  44 |       NESTED LOOPS       |              |    64 | 13248 |   146   (1)| 00:00:01 |
|  45 |        NESTED LOOPS      |              |    64 | 13248 |   146   (1)| 00:00:01 |
|* 46 |         TABLE ACCESS FULL| PLM_PROGRAMS |    44 |  1496 |    14   (8)| 00:00:01 |
|* 47 |         INDEX RANGE SCAN | IDX_DELIVERY_1               |     1 |       |     2   (0)| 00:00:01 |
|* 48 |        TABLE ACCESS BY INDEX ROWID       | PLM_DOCDELIVERY              |     1 |   173 |     3   (0)| 00:00:01 |
|  49 |      TABLE ACCESS BY INDEX ROWID         | ALLOVDIM     |     1 |    44 |     2   (0)| 00:00:01 |
|* 50 |       INDEX RANGE SCAN   | ALLOVDIM_I_EMP_CMP           |     1 |       |     1   (0)| 00:00:01 |
|  51 |     VIEW PUSHED PREDICATE| CC_MC_VIEW   |     1 |   187 |   114   (2)| 00:00:01 |
|  52 |      SORT UNIQUE         |              |     1 |   217 |   114   (2)| 00:00:01 |
|* 53 |       FILTER             |              |       |       |            |          |
|  54 |        NESTED LOOPS OUTER|              |     1 |   217 |   113   (1)| 00:00:01 |
|  55 |         NESTED LOOPS OUTER               |              |     1 |   173 |    97   (2)| 00:00:01 |
|* 56 |          HASH JOIN OUTER |              |     1 |   167 |    96   (2)| 00:00:01 |
|  57 |           NESTED LOOPS OUTER             |              |     1 |   161 |    48   (0)| 00:00:01 |
|  58 |            NESTED LOOPS OUTER            |              |     1 |   117 |    46   (0)| 00:00:01 |
|  59 |             NESTED LOOPS OUTER           |              |     1 |    90 |    32   (0)| 00:00:01 |
|  60 |              NESTED LOOPS OUTER          |              |     1 |    65 |    18   (0)| 00:00:01 |
|* 61 |               TABLE ACCESS BY INDEX ROWID| T2002_MERKAZEI_TAMHIR_CUR    |     1 |    40 |     4   (0)| 00:00:01 |
|* 62 |INDEX RANGE SCAN          | T2002_MERKAZEI_TAMHIR_CUR_I1 |     3 |       |     1   (0)| 00:00:01 |
|  63 |               TABLE ACCESS BY INDEX ROWID| T2003_KODEI_MERKAZEI_TAMHIR  |     1 |    25 |    14   (0)| 00:00:01 |
|* 64 |INDEX RANGE SCAN          | T2003_K_MT97_Y_AE_I          |     1 |       |    13   (0)| 00:00:01 |
|  65 |              TABLE ACCESS BY INDEX ROWID | T2003_KODEI_MERKAZEI_TAMHIR  |     1 |    25 |    14   (0)| 00:00:01 |
|* 66 |               INDEX RANGE SCAN           | T2003_K_MT97_Y_AE_I          |     1 |       |    13   (0)| 00:00:01 |
|  67 |             TABLE ACCESS BY INDEX ROWID  | T2003_KODEI_MERKAZEI_TAMHIR  |     1 |    27 |    14   (0)| 00:00:01 |
|* 68 |              INDEX RANGE SCAN            | T2003_K_MT97_Y_AE_I          |     1 |       |    13   (0)| 00:00:01 |
|  69 |            TABLE ACCESS BY INDEX ROWID   | ALLOVDIM     |     1 |    44 |     2   (0)| 00:00:01 |
|* 70 |             INDEX RANGE SCAN             | ALLOVDIM_I_CMP_MIS           |     1 |       |     1   (0)| 00:00:01 |
|* 71 |           TABLE ACCESS FULL              | DWH_COMPANIES|     1 |     6 |    47   (0)| 00:00:01 |
|  72 |          TABLE ACCESS BY INDEX ROWID     | DWH_COMPANIES|     1 |     6 |     1   (0)| 00:00:01 |
|* 73 |           INDEX UNIQUE SCAN              | COMP_IDX1    |     1 |       |     0   (0)| 00:00:01 |
|  74 |         TABLE ACCESS BY INDEX ROWID      | ALLOVDIM     |     1 |    44 |    16   (0)| 00:00:01 |
|* 75 |          INDEX RANGE SCAN| ALLOVDIM_I_CMP_MIS           |     1 |       |    15   (0)| 00:00:01 |

带有 WITH 子句的变体(性能良好)

with CC as
(SELECT /*+full(E) */  
DISTINCT/* a lot of fields */
FROM dwh.t2002_merkazei_tamhir_cur a
LEFT JOIN dwh.allovdim b
ON a.oved_achrai_char = TO_CHAR(b.mis_oved)
AND a.company         = b.company
LEFT JOIN dwh.t2003_kodei_merkazei_tamhir h
ON h.year     = TO_CHAR(SYSDATE-28,'yyyy')
AND h.erech   = a.c01_agaf
AND h.company = A.company
AND h.amuda   = '01'
LEFT JOIN dwh.t2003_kodei_merkazei_tamhir g
ON g.erech    = a.c03_minhal_rb
AND g.amuda   = '03'
AND g.year    = TO_CHAR(SYSDATE-28,'yyyy')
AND g.company = A.company
LEFT JOIN DWH_COMPANIES E
ON A.COMPANY = E.COM_COMPANY_CODE
LEFT JOIN dwh.t2003_kodei_merkazei_tamhir d
ON d.erech    = a.c02_minhalhativa
AND d.amuda   = '02'
AND D.year    = TO_CHAR(SYSDATE-28,'yyyy')
AND A.COMPANY = D.COMPANY
LEFT JOIN dwh.allovdim c
ON d.oved_achrai = c.mis_oved
AND d.company    = c.company
LEFT JOIN DWH_COMPANIES F
on D.COMPANY    = F.COM_COMPANY_CODE
WHERE KOD_SGIRA = 1
)
(
SELECT  ROUND(dwh.plm_docdelivery.RELEASEDDATE-dwh.plm_docdelivery.PROCESSSTARTDATE),
ROUND(sysdate         -dwh.plm_docdelivery.PROCESSSTARTDATE),
dwh.plm_docdelivery.*,
dwh.cc_mc_view.*,
dwh.plm_programs.*,
FROM dwh.plm_docdelivery,
DWH.PLM_PROGRAMS,
cc,
dwh.allovdim ENG_OWNER,
dwh.plm_last_rev
WHERE
(
dwh.plm_docdelivery.PROGRAMNUMBER=dwh.plm_programs.PROGRAMNUMBER
AND dwh.plm_docdelivery.COMPANY=dwh.plm_programs.COMPANY
AND dwh.plm_docdelivery.LOGISTICCOMPANY=dwh.plm_programs.LOGISTICCOMPANY
)
AND
(dwh.plm_docdelivery.ENGOWNERID= ENG_OWNER.EMP_ID(+))
AND
(cc.MERKAZ_TAMHIR(+)=ENG_OWNER.MIS_TAMH
AND cc.COMPANY(+)  =ENG_OWNER.COMPANY)
AND
(dwh.plm_last_rev.COMPANY            =dwh.plm_docdelivery.COMPANY
AND dwh.plm_last_rev.LOGISTICCOMPANY=dwh.plm_docdelivery.LOGISTICCOMPANY
AND dwh.plm_last_rev.PROGRAMNUMBER  =dwh.plm_docdelivery.PROGRAMNUMBER
AND dwh.plm_last_rev.DOCUMENT       =dwh.plm_docdelivery.DOCUMENT)
AND
(ENG_OWNER.COMPANY<>'SOL')
AND
(dwh.plm_docdelivery.PROGRAMNUMBER IN ('X395','X419','X422','X379','X454','X372','X308', 'X394','X426','X433','X423','X391','X391A','X393','X490','X510','X460','X466A','X466B', 'X466C','X448','T622','T610','X461','X470','X520','X436','X560','D308','X922B','X922','X435', 'X494','X402','X995SP','X493','X481','X990','T799')
AND
(dwh.plm_docdelivery.CDRLTYPE    <> 'SDRL'
OR dwh.plm_docdelivery.CDRLTYPE IS NULL)
AND dwh.plm_last_rev.LAST_REV = dwh.plm_docdelivery.DOCUMENTREVISION
AND((dwh.plm_docdelivery.AUTHORDATE <= '16-07-2017 00:00:00'
AND(dwh.plm_docdelivery.STATUS    IN ( '(Freeze)','(Released)' )
OR dwh.plm_docdelivery.STATUS IS NULL))
OR dwh.plm_docdelivery.RELEASEDDATE IS NOT NULL)
AND dwh.plm_programs.COMPANY IN ('ESL','TCL'))
MINUS
SELECT ROUND(dwh.plm_docdelivery.RELEASEDDATE-dwh.plm_docdelivery.PROCESSSTARTDATE),
ROUND(sysdate-dwh.plm_docdelivery.PROCESSSTARTDATE),
dwh.plm_docdelivery.STATUS,
dwh.plm_docdelivery.SIGNERSLEFT,
dwh.plm_docdelivery.RELEASEDDATE,
dwh.plm_docdelivery.PROGRAMNUMBER,
dwh.plm_programs.PROGRAMNAME,
cc.MINHALHATIVA,
TO_CHAR(dwh.plm_docdelivery.PLANNEDVALUE)
||
dwh.plm_docdelivery.TIMEUNIT
||
' '
||
CASE
WHEN dwh.plm_docdelivery.PLANNEDRELATION='After'
THEN '+'
WHEN dwh.plm_docdelivery.PLANNEDRELATION='Before'
THEN '-'
ELSE ''
END
||
dwh.plm_docdelivery.CDRLGATENAME,
ENG_OWNER.MISHPAHA,
ENG_OWNER.MISHPAHA_ENG,
ENG_OWNER.PRATI,
ENG_OWNER.PRATI_ENG,
dwh.plm_docdelivery.ENGOWNERID,
dwh.plm_docdelivery.ENGDISCIPLINE,
cc.ACHRAI_HATIVA_NAME,
cc.OVED_ACHRAI_HATIVA_FULL,
cc.ACHRAI_MT_NAME,
cc.OVED_ACHRAI_MT_FULL,
dwh.plm_docdelivery.DOCUMENTREVISION,
dwh.plm_docdelivery.DOCUMENTNAME,
dwh.plm_docdelivery.DOCUMENT,
dwh.plm_docdelivery.DELIVERY,
dwh.plm_docdelivery.CURRENTUSER ,
cc.MERKAZ_TAMHIR,
dwh.plm_docdelivery.CDRLTYPE,
dwh.plm_docdelivery.CDRL,
dwh.plm_docdelivery.AUTHORDATE,
dwh.plm_docdelivery.DOC_REV_CREATION_DATE,
dwh.plm_docdelivery.DELIVERY_CREATION_DATE,
dwh.plm_docdelivery.GATEORIGINALDATE,
dwh.plm_programs.STATUS_DATE,
dwh.plm_docdelivery.ProcedureName,
dwh.plm_last_rev.LAST_REV,
dwh.plm_programs.COMPANY
FROM dwh.plm_docdelivery,DWH.PLM_PROGRAMS,cc,dwh.allovdim ENG_OWNER,dwh.plm_last_rev
WHERE(dwh.plm_docdelivery.PROGRAMNUMBER=dwh.plm_programs.PROGRAMNUMBER
AND dwh.plm_docdelivery.COMPANY=dwh.plm_programs.COMPANY
AND dwh.plm_docdelivery.LOGISTICCOMPANY=dwh.plm_programs.LOGISTICCOMPANY)
AND(dwh.plm_docdelivery.ENGOWNERID=ENG_OWNER.EMP_ID(+))
AND(cc.MERKAZ_TAMHIR(+)=ENG_OWNER.MIS_TAMH
AND cc.COMPANY(+)=ENG_OWNER.COMPANY)
AND(dwh.plm_last_rev.COMPANY=dwh.plm_docdelivery.COMPANY
AND dwh.plm_last_rev.LOGISTICCOMPANY=dwh.plm_docdelivery.LOGISTICCOMPANY
AND dwh.plm_last_rev.PROGRAMNUMBER=dwh.plm_docdelivery.PROGRAMNUMBER
AND dwh.plm_last_rev.DOCUMENT=dwh.plm_docdelivery.DOCUMENT)
AND(ENG_OWNER.COMPANY<>'SOL')
AND(dwh.plm_docdelivery.PROGRAMNUMBER IN ('X395','X419','X422','X379','X454','X372','X308', 'X394','X426','X433','X423','X391','X391A','X393','X490','X510','X460','X466A','X466B', 'X466C','X448','T622','T610','X461','X470','X520','X436','X560','D308','X922B','X922','X435', 'X494','X402','X995SP','X493','X481','X990','T799')
AND dwh.plm_docdelivery.DELIVERY IS NOT NULL
AND dwh.plm_docdelivery.DOCUMENT IS NULL
AND dwh.plm_programs.COMPANY IN ('CMP1','CMP2'))); 

解释 WITH 子句的计划

Plan hash value: 2179438877
-----------------------------------------------------------------------------------------------------------------------------
| Id  | Operation             | Name        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |    20 | 18560 |       | 28536   (3)| 00:01:26 |
|   1 |  TEMP TABLE TRANSFORMATION            |             |       |       |       |            |          |
|   2 |   LOAD AS SELECT      | SYS_TEMP_0FDA4CB1D_E5C2B79E |       |       |       |            |          |
|   3 |    HASH UNIQUE        |             |  5692 |  1206K|  1312K|  4670   (2)| 00:00:15 |
|*  4 |     HASH JOIN RIGHT OUTER             |             |  5692 |  1206K|       |  4245   (2)| 00:00:13 |
|   5 |      TABLE ACCESS FULL| DWH_COMPANIES               |   101 |   606 |       |    47   (0)| 00:00:01 |
|*  6 |      HASH JOIN OUTER  |             |  5691 |  1172K|       |  4197   (2)| 00:00:13 |
|*  7 |       HASH JOIN OUTER |             |  5691 |   928K|       |  2452   (2)| 00:00:08 |
|*  8 |        HASH JOIN RIGHT OUTER          |             |  5691 |   683K|       |   706   (1)| 00:00:03 |
|   9 |         TABLE ACCESS FULL             | DWH_COMPANIES               |   101 |   606 |       |    47   (0)| 00:00:01 |
|* 10 |         HASH JOIN RIGHT OUTER         |             |  5691 |   650K|       |   659   (1)| 00:00:02 |
|  11 |          TABLE ACCESS BY INDEX ROWID  | T2003_KODEI_MERKAZEI_TAMHIR |    25 |   675 |       |    37   (0)| 00:00:01 |
|* 12 |           INDEX SKIP SCAN             | T2003_K_MT97_Y_AE_I         |    25 |       |       |    34   (0)| 00:00:01 |
|* 13 |          HASH JOIN RIGHT OUTER        |             |  5691 |   500K|       |   621   (1)| 00:00:02 |
|  14 |           TABLE ACCESS BY INDEX ROWID | T2003_KODEI_MERKAZEI_TAMHIR |    25 |   625 |       |    37   (0)| 00:00:01 |
|* 15 |            INDEX SKIP SCAN            | T2003_K_MT97_Y_AE_I         |    25 |       |       |    34   (0)| 00:00:01 |
|* 16 |           HASH JOIN RIGHT OUTER       |             |  5691 |   361K|       |   584   (1)| 00:00:02 |
|  17 |            TABLE ACCESS BY INDEX ROWID| T2003_KODEI_MERKAZEI_TAMHIR |    25 |   625 |       |    37   (0)| 00:00:01 |
|* 18 |             INDEX SKIP SCAN           | T2003_K_MT97_Y_AE_I         |    25 |       |       |    34   (0)| 00:00:01 |
|* 19 |            TABLE ACCESS FULL          | T2002_MERKAZEI_TAMHIR_CUR   |  5691 |   222K|       |   547   (1)| 00:00:02 |
|  20 |        TABLE ACCESS FULL              | ALLOVDIM    | 51269 |  2202K|       |  1744   (2)| 00:00:06 |
|  21 |       TABLE ACCESS FULL               | ALLOVDIM    | 51269 |  2202K|       |  1744   (2)| 00:00:06 |
|  22 |   MINUS               |             |       |       |       |            |          |
|  23 |    SORT UNIQUE        |             |    20 |  9280 |       | 14268   (3)| 00:00:43 |
|* 24 |     HASH JOIN OUTER   |             |    20 |  9280 |       | 14267   (3)| 00:00:43 |
|  25 |      NESTED LOOPS     |             |    20 |  5540 |       | 14146   (3)| 00:00:43 |
|  26 |       NESTED LOOPS    |             |    20 |  5540 |       | 14146   (3)| 00:00:43 |
|* 27 |        HASH JOIN      |             |    20 |  4660 |       | 14106   (3)| 00:00:43 |
|* 28 |         TABLE ACCESS FULL             | PLM_LAST_REV|    50 |  1300 |       | 13959   (3)| 00:00:42 |
|  29 |         NESTED LOOPS  |             |   798 |   161K|       |   147   (2)| 00:00:01 |
|  30 |          NESTED LOOPS |             |   798 |   161K|       |   147   (2)| 00:00:01 |
|* 31 |           TABLE ACCESS FULL           | PLM_PROGRAMS|    44 |  1496 |       |    14   (8)| 00:00:01 |
|* 32 |           INDEX RANGE SCAN            | IDX_DELIVERY_1              |     1 |       |       |     2   (0)| 00:00:01 |
|* 33 |          TABLE ACCESS BY INDEX ROWID  | PLM_DOCDELIVERY             |    18 |  3114 |       |     3   (0)| 00:00:01 |
|* 34 |        INDEX RANGE SCAN               | ALLOVDIM_I_EMP_CMP          |     1 |       |       |     1   (0)| 00:00:01 |
|  35 |       TABLE ACCESS BY INDEX ROWID     | ALLOVDIM    |     1 |    44 |       |     2   (0)| 00:00:01 |
|* 36 |      VIEW             |             |  5692 |  1039K|       |   121   (1)| 00:00:01 |
|  37 |       TABLE ACCESS FULL               | SYS_TEMP_0FDA4CB1D_E5C2B79E |  5692 |  1206K|       |   121   (1)| 00:00:01 |
|  38 |    SORT UNIQUE        |             |    20 |  9280 |       | 14268   (3)| 00:00:43 |
|* 39 |     HASH JOIN OUTER   |             |    20 |  9280 |       | 14267   (3)| 00:00:43 |
|  40 |      NESTED LOOPS     |             |    20 |  5540 |       | 14145   (3)| 00:00:43 |
|  41 |       NESTED LOOPS    |             |    20 |  5540 |       | 14145   (3)| 00:00:43 |
|* 42 |        HASH JOIN      |             |    20 |  4660 |       | 14105   (3)| 00:00:43 |
|* 43 |         TABLE ACCESS FULL             | PLM_LAST_REV|    50 |  1300 |       | 13959   (3)| 00:00:42 |
|  44 |         NESTED LOOPS  |             |    64 | 13248 |       |   146   (1)| 00:00:01 |
|  45 |          NESTED LOOPS |             |    64 | 13248 |       |   146   (1)| 00:00:01 |
|* 46 |           TABLE ACCESS FULL           | PLM_PROGRAMS|    44 |  1496 |       |    14   (8)| 00:00:01 |
|* 47 |           INDEX RANGE SCAN            | IDX_DELIVERY_1              |     1 |       |       |     2   (0)| 00:00:01 |
|* 48 |          TABLE ACCESS BY INDEX ROWID  | PLM_DOCDELIVERY             |     1 |   173 |       |     3   (0)| 00:00:01 |
|* 49 |        INDEX RANGE SCAN               | ALLOVDIM_I_EMP_CMP          |     1 |       |       |     1   (0)| 00:00:01 |
|  50 |       TABLE ACCESS BY INDEX ROWID     | ALLOVDIM    |     1 |    44 |       |     2   (0)| 00:00:01 |
|* 51 |      VIEW             |             |  5692 |  1039K|       |   121   (1)| 00:00:01 |
|  52 |       TABLE ACCESS FULL               | SYS_TEMP_0FDA4CB1D_E5C2B79E |  5692 |  1206K|       |   121   (1)| 00:00:01 |

【问题讨论】:

  • 你没有给我们任何信息继续下去。我可以问你“我有一个查询,但速度很慢。为什么?”你能回答我的问题吗?您是否看到您提出了一个非常相似的问题 - 即没有任何信息可以让我们帮助您诊断问题?请更新您的问题以包含相关视图和查询,以及好查询和坏查询的执行计划(如果您不确定如何执行此操作,请参阅blogs.oracle.com/sql/how-to-create-an-execution-plan)。然后,我们也许可以帮助您。证明问题的完整测试用例加分!
  • 我们看不到您的视图定义、表、索引、数据或您正在运行的语句,或者它们的执行计划。所以这是非常模糊和抽象的。
  • 总的来说,我想知道为什么 view 和 with 之间存在差异,但是好的 - 我添加了整个代码。

标签: sql oracle performance views


【解决方案1】:

“总的来说,我想知道为什么 view 和 with 有区别”

在调优中有非常普遍适用的规则。大多数情况取决于具体情况。因此,在您的情况下,相关点是第二个解释计划中的这一步:

TEMP TABLE TRANSFORMATION            

基本上,调整连接表和视图的查询很难,因为优化器无法确定视图将返回多少行。这通常会导致一个糟糕的计划,就像这里一样。如果您查看第一个计划,优化器选择了VIEW PUSHED PREDICATE。这意味着它将为其他表中的每一行查询一次您的视图。两次,因为 MINUS 运算符。因为优化器将谓词推送到视图查询 (ENG_OWNER.MIS_TAMH, ENG_OWNER.COMPANY) 中,所以它使用一系列嵌套循环来执行视图查询。对于大型表,这可能是一项昂贵的操作。

然而,使用 WITH 子句,优化器可以查看一个查询中的所有表,并可以决定将子查询结果集具体化为临时表。临时表并不总是具有执行性,因为它们涉及对临时表空间的写入和读取,而且许多 DBA 不会费心适当地配置他们的表空间。然而,物化的最大优势是视图查询只执行一次,并且(只要结果集足够小)读取一次并保存在内存中。

由于物化似乎有效,您可以使用提示。而不是从视图中获取整个查询的 WITH 子句只是这样做

with CC_MC_VIEW  as (select /*+ materialize  */ 
                     from dwh.CC_MC_VIEW )
select ...

【讨论】:

  • 好的,谢谢。我不确定当您说“这意味着数据库不断为其他表中的每一行重新查询您的整个视图的结果集”时您的意思是什么......所以,您认为解决方案实际上是删除从查询中查看并将其替换为 with 子句?
  • 重写了我的答案,以便更清楚地了解(我认为)正在发生的事情。包括访问信息(来自解释计划的底部)将更容易确定 CBO 的决策。
【解决方案2】:

通常在 Oracle 上应该没有区别。 With 子句可以是 INLINEed 或 MATERIALIZEd。查看文档如何使用这些提示。此外,可以修改 VIEW 如何“嵌入”到执行计划中的方式。查看文档和搜索参数 complex_view_merging/simple_view_merging。

您能做的最好的事情就是比较两者的执行计划。没有看到他们,没有人可以帮助你。理论上,Oracle 优化器应该为这两种情况生成相同的执行计划,如果它们应该返回相同的结果。

更新:在第二种情况下,视图已物化(请参阅 TEMP TABLE TRANSFORMATION)。 Oracle 将 VIEW 查询中的内容存储到 TEMP 表空间中,并将其用于进一步连接。理论上这应该比内联(第一种情况)慢。

正如@William INLINE/MATERIALIZE 所指出的,提示未正式记录。 不幸的是,其他参数也没有记录。 尝试使用 sqlplus(不是 SqlDeveloper)4x 执行慢查询并通过设置(所有 4 个组合/true/false)更改 CBO 参数

alter session set "_complex_view_merging"=true;
alter session set "_simple_view_merging"=true;

然后看看会发生什么。并且可能值得尝试从 VIEW 定义中删除 FULL 提示。您永远不知道您将如何使用视图,将使用哪些谓词,因此可能不需要表 DWH_COMPANIES 上的“FULL TABLE SCAN”。

【讨论】:

  • inlinematerialize 提示是众所周知的未记录的。
  • 据我所知,这些提示用于您想要优化 with 子句的情况。在我的情况下,情况恰恰相反。带有“with”的查询运行良好,问题在于视图之一。
猜你喜欢
  • 2017-04-13
  • 2022-11-02
  • 2020-04-27
  • 1970-01-01
  • 2021-02-26
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
相关资源
最近更新 更多