Просмотр производительности по сравнению с производительностью - PullRequest
0 голосов
/ 25 июня 2018

У меня есть запрос, который выбирается из представления и из нескольких таблиц.

Когда я выполняю этот запрос "как есть" - производительность очень плохая.

Когда я 'Принимая запрос представления и добавляя его к внешнему запросу с помощью WITH CLAUSE, он выполняется очень быстро.

Мой тест показывает, что проблема не в самом запросе представления, а в том, как оптимизатор присоединяетсяпросмотреть данные с другими данными.

Какое объяснение этой проблемы?

В запросах на выборку отсутствуют некоторые поля из-за ограничения в 30 КБ символов.

--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 |

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

"В общем, я хочу знать, почему существует разница между представлением и с"

. В настройке есть очень универсально применимые правила.В основном все зависит от специфики.Таким образом, в вашем случае уместным является следующий шаг во втором плане объяснения:

TEMP TABLE TRANSFORMATION            

По сути, настройка запроса, объединяющего таблицы и представления, трудна, поскольку оптимизатор не может точно знать, сколько строквид вернется.Это часто приводит к плохому плану, как здесь.Если вы посмотрите на первый план, оптимизатор выбрал VIEW PUSHED PREDICATE.Это означает, что он будет запрашивать ваше представление один раз для каждой строки в других таблицах.Дважды из-за оператора МИНУС.Поскольку оптимизатор помещает предикаты в запрос представления (ENG_OWNER.MIS_TAMH, ENG_OWNER.COMPANY), он использует серию вложенных циклов для выполнения запроса представления.Для больших таблиц это может быть дорогостоящей операцией.

Принимая во внимание, что с помощью предложения WITH оптимизатор может видеть все таблицы в одном запросе и может принять решение о материализации набора результатов подзапроса во временной таблице.Временные таблицы не всегда производительны, потому что они включают запись и чтение из временного табличного пространства, и многие администраторы баз данных не удосуживаются соответствующим образом настроить свои табличные пространства.Однако большое преимущество материализации состоит в том, что запрос представления выполняется только один раз и (при условии, что результирующий набор достаточно мал) читается один раз и сохраняется в памяти.

Поскольку материализация, кажется, работает, вы можете использовать подсказку.Вместо предложения WITH, содержащего весь запрос из представления, просто выполните

with CC_MC_VIEW  as (select /*+ materialize  */ 
                     from dwh.CC_MC_VIEW )
select ...
0 голосов
/ 25 июня 2018

Вообще на Oracle не должно быть никакой разницы. С предложением может быть как INLINEed, так и MATERIALIZEd. Посмотрите документацию, как использовать эти советы. Также можно изменить способ «встраивания» VIEW в план выполнения. Посмотрите документы и параметры поиска complex_view_merging / simple_view_merging.

Лучшее, что вы можете сделать, это сравнить планы выполнения для обоих. Не видя их, никто не сможет вам помочь. Теоретически оптимизатор Oracle должен сгенерировать одинаковый план exec для обоих случаев, если предполагается, что он возвращает идентичные результаты.

ОБНОВЛЕНИЕ: во втором случае МАТЕРИАЛИЗИРОВАННОЕ представление (см. TEMP TABLE TRANSFORMATION). Oracle хранит содержимое запроса VIEW в табличном пространстве TEMP и использует его для дальнейшего объединения. Теоретически это должно быть медленнее, чем вставка (1-й случай).

как отмечено в подсказке @William INLINE / MATERIALIZE, официально недокументировано. к сожалению, другие параметры также не документированы. Попробуйте выполнить медленный запрос с использованием sqlplus (не SqlDeveloper) 4x и измените параметры CBO, установив (все 4 комбинации / true / false)

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

И посмотри, что получится. И, возможно, стоит попытаться удалить подсказку FULL из определения VIEW. Вы никогда не знаете, как yo будет использовать представление, которое будет использовать предикаты, и поэтому «FULL TABLE SCAN» в таблице DWH_COMPANIES может не понадобиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...