2017-08-09 104 views
0

JOIN上甲骨文 - OUTER與XMLTABLE

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 
PL/SQL Release 11.2.0.3.0 - Production 
"CORE 11.2.0.3.0 Production" 
TNS for IBM/AIX RISC System/6000: Version 11.2.0.3.0 - Production 
NLSRTL Version 11.2.0.3.0 - Production 

我創建一個表上的視圖與XMLTYPE作爲列;視圖是工作,但它需要大量的返回結果:

CREATE OR REPLACE FORCE VIEW "VW_FATT_TRASP_CONN_NEW" ("TCODICEFLUSSO", "TCODICETIPOFATTURA", "TIPOLOGIA_FATTURA", "TNUMEROSEQUENZA", "TDATAEMISSIONEFATTURA", "TDATASCADENZAFATTURA", "TRAGIONESOCIALEMITTENTE", "TPARTITAIVAMITTENTE", "TINDIRIZZOMITTENTE", "TCAPMITTENTE", "TLOCALITAMITTENTE", "TPROVINCIAMITTENTE", "TNAZIONEMITTENTE", "TIBANMITTENTE", "TRAGIONESOCIALEDESTINATARIO", "TPARTITAIVADESTINATARIO", "TINDIRIZZODESTINATARIO", "TCAPDESTINATARIO", "TLOCALITADESTINATARIO", "TPROVINCIADESTINATARIO", "TNAZIONEDESTINATARIO", "TCONTRATTODISPACCIAMENTO", "FNUMEROFATTURA", "FPERIODOCOMPETENZADA", "FPERIODOCOMPETENZAA", "FCODICEVOCEFATTURATA", "FTOTALEIMPONIBILEFATTURA", "FTOTALEIVAFATTURA", "FTOTALEFATTURA", "FIMPORTOBOLLO", "NOTEFATTURA", "RTIPOLOGIACONTRATTUALE", "RCODICEMOTIVAZIONE", "RCORRINDEPREST", "RNUMEROPOD", "RTOTTARDISTQTFISSA", "RTOTTARDISTQTPOTENZA", "RTOTTARDISTENATTIVA", "RTOTTARDISTENREATTIVA", "RTOTONGENULTCOMQTFISSA", "RTOTONGENULTCOMQTPOTENZA", "RTOTONGENULTCOMENATTIVA", "RTOTALEQUOTAFISSA", "RTOTALEQUOTAPOTENZA", "RTOTALEENERGIAATTIVA", "RTOTALEENERGIAREATTIVA", "RTOTALEGENERALE", "RALIQUOTAIVA", "RIMPONIBILEIVA", "RIMPORTOIVA", "DCODICEPOD", "DDTTENSIONE", "DDTPOTENZAIMPEGNATA", "DDTPOTENZADISPONIBILE", "DDCTIPOLOGIACONTRATTUALE", "DDCTARIFFADISTRIBUZIONE", "DDCPRODUTTORIPURIPERIZIA", "DDCFORNITURAENERGIVORA", "DIDCALCOLO", "DDATICLIENTE", "DCOMPONENTE", "DCTSANNO", "DCTSPROGRESSIVO", "DPERIODOCOMPETENZADA", "DPERIODOCOMPETENZAA", "DSCAGLIONE", "DQUANTITA", "DCORRISPETTIVOUNITARIO", "DCODICEIVA", "DIMPORTO", "NOME_FILE") AS 
    SELECT 
TB_TESTATA_FLUSSO.TCodiceFlusso, 
TB_TESTATA_FLUSSO.TCodiceTipoFattura, 
CASE 
WHEN TB_TESTATA_FLUSSO.TCodiceTipoFattura IN ('C', 'R') THEN 'TRASPORTO' 
WHEN TB_TESTATA_FLUSSO.TCodiceTipoFattura = 'U' THEN 'CONNESSIONE' 
ELSE 'NON DEFINITO' 
END AS TIPOLOGIA_FATTURA, 
TB_TESTATA_FLUSSO.TNumeroSequenza, 
TB_TESTATA_FLUSSO.TDataEmissioneFattura, 
TB_TESTATA_FLUSSO.TDataScadenzaFattura, 
TB_TESTATA_FLUSSO.TRagioneSocialeMittente, 
TB_TESTATA_FLUSSO.TPartitaIVAMittente, 
TB_TESTATA_FLUSSO.TIndirizzoMittente, 
TB_TESTATA_FLUSSO.TCAPMittente, 
TB_TESTATA_FLUSSO.TLocalitaMittente, 
TB_TESTATA_FLUSSO.TProvinciaMittente, 
TB_TESTATA_FLUSSO.TNazioneMittente, 
TB_TESTATA_FLUSSO.TIBANMittente, 
TB_TESTATA_FLUSSO.TRagioneSocialeDestinatario, 
TB_TESTATA_FLUSSO.TPartitaIVADestinatario, 
TB_TESTATA_FLUSSO.TIndirizzoDestinatario, 
TB_TESTATA_FLUSSO.TCAPDestinatario, 
TB_TESTATA_FLUSSO.TLocalitaDestinatario, 
TB_TESTATA_FLUSSO.TProvinciaDestinatario, 
TB_TESTATA_FLUSSO.TNazioneDestinatario, 
TB_TESTATA_FLUSSO.TContrattoDispacciamento, 
--TB_TCodiceFlusso.TCodiceFlusso, 
TB_FATTURE.FNumeroFattura, 
TB_TESTATA_FATTURA.FPeriodoCompetenzaDa, 
TB_TESTATA_FATTURA.FPeriodoCompetenzaA, 
TB_TESTATA_FATTURA.FCodiceVoceFatturata, 
TO_NUMBER(REPLACE(TB_TESTATA_FATTURA.FTotaleImponibileFattura,'.',',')) AS FTotaleImponibileFattura, 
TO_NUMBER(REPLACE(TB_TESTATA_FATTURA.FTotaleIVAFattura,'.',',')) AS FTotaleIVAFattura, 
TO_NUMBER(REPLACE(TB_TESTATA_FATTURA.FTotaleFattura,'.',',')) AS FTotaleFattura, 
TO_NUMBER(REPLACE(TB_TESTATA_FATTURA.FImportoBollo,'.',',')) AS FImportoBollo, 
TB_RIEPILOGO_FATTURA.NoteFattura, 
TB_RIEPILOGO_VALORI.RTipologiaContrattuale, 
TB_RIEPILOGO_VALORI.RCodiceMotivazione, 
TB_RIEPILOGO_VALORI.RCorrIndePrest, 
TB_RIEPILOGO_VALORI.RNumeroPod, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotTarDistQtFissa,'.',',')) AS RTotTarDistQtFissa, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotTarDistQtPotenza,'.',',')) AS RTotTarDistQtPotenza, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotTarDistEnAttiva,'.',',')) AS RTotTarDistEnAttiva, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotTarDistEnReattiva,'.',',')) AS RTotTarDistEnReattiva, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotOnGenUltComQtFissa,'.',',')) AS RTotOnGenUltComQtFissa, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotOnGenUltComQtPotenza,'.',',')) AS RTotOnGenUltComQtPotenza, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotOnGenUltComEnAttiva,'.',',')) AS RTotOnGenUltComEnAttiva, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotaleQuotaFissa,'.',',')) AS RTotaleQuotaFissa, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotaleQuotaPotenza,'.',',')) AS RTotaleQuotaPotenza, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotaleEnergiaAttiva,'.',',')) AS RTotaleEnergiaAttiva, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotaleEnergiaReattiva,'.',',')) AS RTotaleEnergiaReattiva, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_VALORI.RTotaleGenerale,'.',',')) AS RTotaleGenerale, 
TB_RIEPILOGO_IVA.TB_RIEPILOGO_IVA.RAliquotaIVA, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_IVA.RImponibileIVA,'.',',')) AS RImponibileIVA, 
TO_NUMBER(REPLACE(TB_RIEPILOGO_IVA.RImportoIVA,'.',',')) AS RImportoIVA, 
TB_DETTAGLIO_POD.DCodicePod, 
TB_DATI_TECNICI_COMM.DDTTensione, 
TO_NUMBER(REPLACE(TB_DATI_TECNICI_COMM.DDTPotenzaImpegnata,'.',',')) AS DDTPotenzaImpegnata, 
TO_NUMBER(REPLACE(TB_DATI_TECNICI_COMM.DDTPotenzaDisponibile,'.',',')) AS DDTPotenzaDisponibile, 
TB_DATI_TECNICI_COMM.DDCTipologiaContrattuale, 
TB_DATI_TECNICI_COMM.DDCTariffaDistribuzione, 
TB_DATI_TECNICI_COMM.DDCProduttoriPuriPerizia, 
TB_DATI_TECNICI_COMM.DDCFornituraEnergivora, 
TB_CORRISPETTIVI.DIDCalcolo, 
TB_CORRISPETTIVI.DDatiCliente, 
TB_CORRISPETTIVI.DComponente, 
TB_CORRISPETTIVI.DCTSAnno, 
TB_CORRISPETTIVI.DCTSProgressivo, 
TB_CORRISPETTIVI.DPeriodoCompetenzaDa, 
TB_CORRISPETTIVI.DPeriodoCompetenzaA, 
TB_CORRISPETTIVI.DScaglione, 
TO_NUMBER(REPLACE(TB_CORRISPETTIVI.DQuantita,'.',',')) AS DQuantita, 
TO_NUMBER(REPLACE(TB_CORRISPETTIVI.DCorrispettivoUnitario,'.',',')) AS DCorrispettivoUnitario, 
TB_CORRISPETTIVI.DCodiceIVA, 
TO_NUMBER(REPLACE(TB_CORRISPETTIVI.DImporto,'.',',')) AS DImporto, 
MS525.NOME_FILE 
FROM MS525_FILE_XML MS525 LEFT JOIN 
XMLTABLE('FlussoFattureTrasporto' 
     PASSING MS525.XML_DATI 
     COLUMNS 
      TCodiceFlusso VARCHAR2(10) PATH 'TestataFlusso/TCodiceFlusso', 
      TCodiceTipoFattura VARCHAR2(10) PATH 'TestataFlusso/TCodiceTipoFattura', 
      TNumeroSequenza VARCHAR2(10) PATH 'TestataFlusso/TNumeroSequenza', 
      TDataEmissioneFattura VARCHAR2(10) PATH 'TestataFlusso/TDataEmissioneFattura', 
      TDataScadenzaFattura VARCHAR2(10) PATH 'TestataFlusso/TDataScadenzaFattura', 
      TRagioneSocialeMittente VARCHAR2(100) PATH 'TestataFlusso/TRagioneSocialeMittente', 
      TPartitaIVAMittente VARCHAR2(50) PATH 'TestataFlusso/TPartitaIVAMittente', 
      TIndirizzoMittente VARCHAR2(100) PATH 'TestataFlusso/TIndirizzoMittente', 
      TCAPMittente VARCHAR2(10) PATH 'TestataFlusso/TCAPMittente', 
      TLocalitaMittente VARCHAR2(100) PATH 'TestataFlusso/TLocalitaMittente', 
      TProvinciaMittente VARCHAR2(10) PATH 'TestataFlusso/TProvinciaMittente', 
      TNazioneMittente VARCHAR2(20) PATH 'TestataFlusso/TNazioneMittente', 
      TIBANMittente VARCHAR2(50) PATH 'TestataFlusso/TIBANMittente', 
      TRagioneSocialeDestinatario VARCHAR2(100) PATH 'TestataFlusso/TRagioneSocialeDestinatario', 
      TPartitaIVADestinatario VARCHAR2(50) PATH 'TestataFlusso/TPartitaIVADestinatario', 
      TIndirizzoDestinatario VARCHAR2(100) PATH 'TestataFlusso/TIndirizzoDestinatario', 
      TCAPDestinatario VARCHAR2(10) PATH 'TestataFlusso/TCAPDestinatario', 
      TLocalitaDestinatario VARCHAR2(100) PATH 'TestataFlusso/TLocalitaDestinatario', 
      TProvinciaDestinatario VARCHAR2(10) PATH 'TestataFlusso/TProvinciaDestinatario', 
      TNazioneDestinatario VARCHAR2(20) PATH 'TestataFlusso/TNazioneDestinatario', 
      TContrattoDispacciamento VARCHAR2(10) PATH 'TestataFlusso/TContrattoDispacciamento', 
      NODO_FLUSSO_FATT XMLTYPE path 'TestataFlusso', 
      NODO_FATTURE XMLTYPE path 'Fatture') TB_TESTATA_FLUSSO ON 1=1 LEFT JOIN 
XMLTABLE('/TestataFlusso' 
     PASSING TB_TESTATA_FLUSSO.NODO_FLUSSO_FATT 
     COLUMNS 
      TCodiceFlusso VARCHAR2(20) PATH 'TCodiceFlusso' 
      ) TB_TCodiceFlusso ON 1=1 LEFT JOIN 
XMLTABLE('/Fatture' 
     PASSING TB_TESTATA_FLUSSO.NODO_FATTURE 
     COLUMNS 
      FNumeroFattura VARCHAR2(20) PATH 'FNumeroFattura', 
      NODO_TESTATA_FATT XMLTYPE PATH 'TestataFattura', 
      NODO_RIEPILOGO_FATT XMLTYPE PATH 'RiepilogoFattura', 
      NODO_DETTAGLIO_POD XMLTYPE PATH 'DettaglioPOD' 
      ) TB_FATTURE ON 1=1 LEFT JOIN 
XMLTABLE('/TestataFattura' 
     PASSING TB_FATTURE.NODO_TESTATA_FATT 
     COLUMNS 
      FPeriodoCompetenzaDa VARCHAR2(20) PATH 'FPeriodoCompetenzaDa', 
      FPeriodoCompetenzaA VARCHAR2(20) PATH 'FPeriodoCompetenzaA', 
    FCodiceVoceFatturata VARCHAR2(20) PATH 'FCodiceVoceFatturata', 
      FTotaleImponibileFattura VARCHAR2(20) PATH 'FTotaleImponibileFattura', 
      FTotaleIVAFattura VARCHAR2(20) PATH 'FTotaleIVAFattura', 
      FTotaleFattura VARCHAR2(20) PATH 'FTotaleFattura', 
    FImportoBollo VARCHAR2(20) PATH 'FImportoBollo' 
      ) TB_TESTATA_FATTURA ON 1=1 LEFT JOIN 
/* 
--Modificata con loop perche' il tag <NoteFattura> puo' comparire piu' di una volta!!! 
XMLTABLE('/RiepilogoFattura' 
     PASSING TB_FATTURE.NODO_RIEPILOGO_FATT 
     COLUMNS 
      NoteFattura VARCHAR2(1000) PATH 'NoteFattura', 
      NODO_RIEPILOGO_VALORI XMLTYPE PATH 'RiepilogoValori', 
      NODO_RIEPILOGO_IVA XMLTYPE PATH 'RiepilogoIVA' 
      ) TB_RIEPILOGO_FATTURA ON 1=1 LEFT JOIN 
*/ 
XMLTABLE('for $i in $XTYPE_NODO_RIEPILOGO_FATT/RiepilogoFattura 
       return element result { 
       for $j at $pos in $i 
        return element row { 
        $i/NoteFattura[$pos], 
        $i/RiepilogoValori, 
        $i/RiepilogoIVA 
        } 
       }/row 
      ' 
      PASSING TB_FATTURE.NODO_RIEPILOGO_FATT as XTYPE_NODO_RIEPILOGO_FATT 
      COLUMNS 
       NoteFattura VARCHAR2(1000) PATH 'NoteFattura', 
       NODO_RIEPILOGO_VALORI XMLTYPE PATH 'RiepilogoValori', 
       NODO_RIEPILOGO_IVA XMLTYPE PATH 'RiepilogoIVA' 
) TB_RIEPILOGO_FATTURA ON 1=1 LEFT JOIN 
XMLTABLE('/RiepilogoValori' 
     PASSING TB_RIEPILOGO_FATTURA.NODO_RIEPILOGO_VALORI 
     COLUMNS 
      RTipologiaContrattuale VARCHAR2(20) PATH 'RTipologiaContrattuale', 
    RCodiceMotivazione VARCHAR2(20) PATH 'RCodiceMotivazione', 
    RCorrIndePrest VARCHAR2(20) PATH 'RCorrIndePrest', 
      RNumeroPod VARCHAR2(20) PATH 'RNumeroPod', 
      RTotTarDistQtFissa VARCHAR2(20) PATH 'RTotTarDistQtFissa', 
      RTotTarDistQtPotenza VARCHAR2(20) PATH 'RTotTarDistQtPotenza', 
      RTotTarDistEnAttiva VARCHAR2(20) PATH 'RTotTarDistEnAttiva', 
      RTotTarDistEnReattiva VARCHAR2(20) PATH 'RTotTarDistEnReattiva', 
      RTotOnGenUltComQtFissa VARCHAR2(20) PATH 'RTotOnGenUltComQtFissa', 
      RTotOnGenUltComQtPotenza VARCHAR2(20) PATH 'RTotOnGenUltComQtPotenza', 
      RTotOnGenUltComEnAttiva VARCHAR2(20) PATH 'RTotOnGenUltComEnAttiva', 
      RTotaleQuotaFissa VARCHAR2(20) PATH 'RTotaleQuotaFissa', 
      RTotaleQuotaPotenza VARCHAR2(20) PATH 'RTotaleQuotaPotenza', 
      RTotaleEnergiaAttiva VARCHAR2(20) PATH 'RTotaleEnergiaAttiva', 
      RTotaleEnergiaReattiva VARCHAR2(20) PATH 'RTotaleEnergiaReattiva', 
      RTotaleGenerale VARCHAR2(20) PATH 'RTotaleGenerale' 
      ) TB_RIEPILOGO_VALORI ON 1=1 LEFT JOIN 
XMLTABLE('/RiepilogoIVA' 
     PASSING TB_RIEPILOGO_FATTURA.NODO_RIEPILOGO_IVA 
     COLUMNS 
      RAliquotaIVA VARCHAR2(5) PATH 'RAliquotaIVA', 
      RImponibileIVA VARCHAR2(20) PATH 'RImponibileIVA', 
      RImportoIVA VARCHAR2(20) PATH 'RImportoIVA' 
      ) TB_RIEPILOGO_IVA ON 1=1 LEFT JOIN 
XMLTABLE('/DettaglioPOD' 
     PASSING TB_FATTURE.NODO_DETTAGLIO_POD 
     COLUMNS 
      DCodicePod VARCHAR2(1000) PATH 'DCodicePod', 
      DATI_TECNICI_COMMERCIALI XMLTYPE PATH 'DatiTecniciCommerciali', 
      CORRISPETTIVI XMLTYPE PATH 'Corrispettivi' 
      ) TB_DETTAGLIO_POD ON 1=1 LEFT JOIN 
XMLTABLE('/DatiTecniciCommerciali' 
     PASSING TB_DETTAGLIO_POD.DATI_TECNICI_COMMERCIALI 
     COLUMNS 
      DDTTensione VARCHAR2(1000) PATH 'DDTTensione', 
      DDTPotenzaImpegnata VARCHAR2(20) PATH 'DDTPotenzaImpegnata', 
      DDTPotenzaDisponibile VARCHAR2(20) PATH 'DDTPotenzaDisponibile', 
      DDCTipologiaContrattuale VARCHAR2(20) PATH 'DDCTipologiaContrattuale', 
      DDCTariffaDistribuzione VARCHAR2(10) PATH 'DDCTariffaDistribuzione', 
      DDCProduttoriPuriPerizia VARCHAR2(10) PATH 'DDCProduttoriPuriPerizia', 
      DDCFornituraEnergivora VARCHAR2(10) PATH 'DDCFornituraEnergivora' 
      ) TB_DATI_TECNICI_COMM ON 1=1 LEFT JOIN 
XMLTABLE('/Corrispettivi' 
     PASSING TB_DETTAGLIO_POD.CORRISPETTIVI 
     COLUMNS 
      DIDCalcolo VARCHAR2(20) PATH 'DIDCalcolo', 
DDatiCliente VARCHAR2(20) PATH 'DDatiCliente', 
      DComponente VARCHAR2(20) PATH 'DComponente', 
DCTSAnno VARCHAR2(20) PATH 'DCTSAnno', 
DCTSProgressivo VARCHAR2(20) PATH 'DCTSProgressivo', 
      DPeriodoCompetenzaDa VARCHAR2(10) PATH 'DPeriodoCompetenzaDa', 
      DPeriodoCompetenzaA VARCHAR2(10) PATH 'DPeriodoCompetenzaA', 
      DScaglione VARCHAR2(10) PATH 'DScaglione', 
      DQuantita VARCHAR2(10) PATH 'DQuantita', 
      DCorrispettivoUnitario VARCHAR2(10) PATH 'DCorrispettivoUnitario', 
      DCodiceIVA VARCHAR2(10) PATH 'DCodiceIVA', 
      DImporto VARCHAR2(20) PATH 'DImporto' 
      ) TB_CORRISPETTIVI ON 1=1; 

在一個10 MB的文件,該viwe需要兩個多小時,返回記錄集。 這裏MS525_FILE_XML表的DDL:

CREATE TABLE MS525_FILE_XML 
(NOME_FILE VARCHAR2(200 BYTE), 
    XML_DATI XMLTYPE, 
    ESITO_OPERAZIONE NUMBER(*,0) DEFAULT 0, 
    DATA_ORA_INSERT TIMESTAMP (6) DEFAULT SYSTIMESTAMP, 
    FLAG_IN_ESECUZIONE NUMBER(*,0) DEFAULT 0, 
CONSTRAINT PK_MS525 PRIMARY KEY (NOME_FILE, DATA_ORA_INSERT) 
); 

下面是執行計劃:

Plan hash value: 2500968592 
---------------------------------------------------------------------------------------------------------------------- 
| Id | Operation         | Name     | Rows | Bytes | Cost (%CPU)| Time  | 
---------------------------------------------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT       |      | 18E| 15E| 18E (0)|999:59:59 | 
| 1 | SORT AGGREGATE        |      |  1 |  4 |   |   | 
|* 2 | COLLECTION ITERATOR PICKLER FETCH   | XMLSEQUENCEFROMXMLTYPE | 82 | 328 | 30 (4)| 00:00:01 | 
| 3 | SORT AGGREGATE        |      |  1 |  2 |   |   | 
| 4 | COLLECTION ITERATOR PICKLER FETCH   | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 5 | NESTED LOOPS OUTER       |      | 18E| 15E| 18E (0)|999:59:59 | 
| 6 | NESTED LOOPS OUTER      |      | 18E| 15E| 18E (0)|999:59:59 | 
| 7 | NESTED LOOPS OUTER      |      | 2425P| 15E| 8681T (1)|999:59:59 | 
| 8 |  NESTED LOOPS OUTER      |      | 296T| 961P| 1062G (1)|999:59:59 | 
| 9 |  NESTED LOOPS OUTER      |      | 36G| 119T| 130M (1)|433:45:23 | 
| 10 |  NESTED LOOPS OUTER     |      | 4451K| 14G| 16021 (1)| 00:03:13 | 
| 11 |  NESTED LOOPS OUTER     |      | 545 | 1520K| 90 (2)| 00:00:02 | 
| 12 |   NESTED LOOPS OUTER     |      |  1 | 2773 | 60 (0)| 00:00:01 | 
| 13 |   NESTED LOOPS OUTER     |      |  1 | 2659 | 31 (0)| 00:00:01 | 
| 14 |   NESTED LOOPS OUTER    |      |  1 | 2659 |  2 (0)| 00:00:01 | 
| 15 |   TABLE ACCESS BY INDEX ROWID  | MS525_FILE_XML   |  1 | 2104 |  0 (0)| 00:00:01 | 
|* 16 |    INDEX RANGE SCAN    | PK_MS525    |  1 |  |  0 (0)| 00:00:01 | 
| 17 |   VIEW        |      |  1 | 555 |  2 (0)| 00:00:01 | 
|* 18 |    FILTER       |      |  |  |   |   | 
| 19 |    FAST DUAL      |      |  1 |  |  2 (0)| 00:00:01 | 
| 20 |   VIEW        |      | 8168 |  | 29 (0)| 00:00:01 | 
| 21 |   COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 22 |   VIEW        |      | 8168 | 909K| 29 (0)| 00:00:01 | 
| 23 |   COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 24 |   VIEW        |      | 8168 | 670K| 29 (0)| 00:00:01 | 
| 25 |   COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 26 |  VIEW         |      | 8168 | 4546K| 29 (0)| 00:00:01 | 
| 27 |   COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 28 |  VIEW         |      | 8168 | 1531K| 29 (0)| 00:00:01 | 
| 29 |  COLLECTION ITERATOR PICKLER FETCH | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 30 |  VIEW         |      | 8168 | 223K| 29 (0)| 00:00:01 | 
| 31 |  COLLECTION ITERATOR PICKLER FETCH  | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 32 |  VIEW         |      | 8168 | 4546K| 29 (0)| 00:00:01 | 
| 33 |  COLLECTION ITERATOR PICKLER FETCH  | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 34 | VIEW          |      | 8168 | 4458K| 29 (0)| 00:00:01 | 
| 35 |  COLLECTION ITERATOR PICKLER FETCH  | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
| 36 | VIEW          |      | 8168 | 909K| 29 (0)| 00:00:01 | 
| 37 | COLLECTION ITERATOR PICKLER FETCH  | XMLSEQUENCEFROMXMLTYPE | 8168 | 16336 | 29 (0)| 00:00:01 | 
---------------------------------------------------------------------------------------------------------------------- 

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

    2 - filter(SYS_XQFNPREDTRUTH(:B1,VALUE(KOKBF$) /* KOKBI$ */)=1) 
    16 - access("MS525"."NOME_FILE"='05779711000_02968430237_DP0114_FTR_C_20170803_001_E.xml') 
    18 - filter(EXISTSNODE(SYS_MAKEXML(0,"MS525"."SYS_NC00003$"),'/FlussoFattureTrasporto')=1) 
+0

爲什麼要留下外連接;使用交叉連接有什麼區別? –

+3

在公共網站上發佈這樣一個可怕的查詢需要一些神經,並期望陌生人花時間去理解它。我們必須向你的樂觀致敬。 – APC

+0

@APC:謝謝,您的評論非常有幫助。 – Yellow75

回答

0

我找到了解決辦法(但我不」知道爲什麼它的工作原理);如果我更換

XMLTABLE('for $i in $XTYPE_NODO_RIEPILOGO_FATT/RiepilogoFattura 
       return element result { 
       for $j at $pos in $i 
        return element row { 
        $i/NoteFattura[$pos], 
        $i/RiepilogoValori, 
        $i/RiepilogoIVA 
        } 
       }/row 
      ' 
      PASSING TB_FATTURE.NODO_RIEPILOGO_FATT as XTYPE_NODO_RIEPILOGO_FATT 
      COLUMNS 
       NoteFattura VARCHAR2(1000) PATH 'NoteFattura', 
       NODO_RIEPILOGO_VALORI XMLTYPE PATH 'RiepilogoValori', 
       NODO_RIEPILOGO_IVA XMLTYPE PATH 'RiepilogoIVA' 
) TB_RIEPILOGO_FATTURA ON 1=1 LEFT JOIN 

XMLTABLE('/RiepilogoFattura' 
     PASSING TB_FATTURE.NODO_RIEPILOGO_FATT 
     COLUMNS 
      NoteFattura VARCHAR2(1000) PATH 'NoteFattura', 
      NODO_RIEPILOGO_VALORI XMLTYPE PATH 'RiepilogoValori', 
      NODO_RIEPILOGO_IVA XMLTYPE PATH 'RiepilogoIVA' 
      ) TB_RIEPILOGO_FATTURA ON 1=1 LEFT JOIN 

沒有考慮n次領域(但只有一個),在30秒內運行查詢。

+0

因此,看起來像您的問題中已註釋的代碼。 – APC

+0

@APC:是的,我試圖採取所有n行「NODO_RIEPILOGO_FATT」;目前,我只拿到我發現的第一排。 – Yellow75