2017-08-09 81 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