2014-12-03 77 views
0

我有一个很慢的查询,我想优化它。我为连接的字段创建了索引。我的查询是这样的:在这个领域如何优化我的oracle查询?

SELECT DISTINCT 
      --a.row_id FK_SERVIZIO, 
      --CLI_UNICO.FK_CLIENTE FK_CLIENTE, 
      CLI.CDC_FISCALE CDC_FISCALE, 
      --com.descrizione 
      --CASE WHEN conc.COMUNE IS NOT NULL THEN 1 ELSE 0 END FL_OFFERTABILITA_GAS 
      CASE WHEN exists (select 1 from STG.T_STG_NBA_DT_S_ASSET_G a where a.owner_accnt_id=CLI.IDC_CLIENTE_CRM_KEY and status_cd in ('ATTIVATO')) 
      THEN 'SI' ELSE 'NO' END FLC_COMUNE_TERR 

FROM  STG.T_STG_NBA_DT_S_ASSET_G A, 
     STG.T_STG_PSP_DT_LISTA_COMUNI_TERR terr, 
     STG.T_STG_NBA_DT_R2DG_COMUNI_G com, 
     STG.T_STG_NBA_DT_S_ADDR_PER_G ind_for, 
     --STG.V_DML_NBA_SITO q, 
     ODS.T_ODS_CRM_DT_CLIENTI_CRM CLI,--ODS.V_ODS_NBA_DT_ASS_CLI_CLIUNICO CLI_UNICO, 
     STG.T_STG_NBA_DT_S_ORG_EXT_G cforn 
     --STG.T_STG_NBA_DT_R2DG_CONCESS_G conc, 


WHERE 

    --CLI.IDC_CLIENTE_CRM_KEY=A.OWNER_ACCNT_ID 
    terr.LDS_DESCRIZIONE_COMUNE=com.DESCRIZIONE 
    AND com.CODICE_ISTAT=ind_for.x_cod_istat 
    AND ind_for.row_id = cforn.PR_ADDR_ID 
    and cforn.row_id=A.serv_acct_id 

我把指数:

terr.LDS_DESCRIZIONE_COMUNE,com.DESCRIZIONE,com.CODICE_ISTAT,ind_for.x_cod_istat,ind_for.row_id,cforn.PR_ADDR_ID,cforn.row_id,A.serv_acct_id,a.owner_accnt_id,CLI.IDC_CLIENTE_CRM_KEY, a.status_cd. 

任何提示我请? 我可以使用PARALLEL?怎么样? 感谢

+0

6张桌子,仅有4连接看起来腥给我! – 2014-12-03 10:22:46

+0

有5加入,还有: 在( 'ATTIVATO')) – user3589887 2014-12-03 10:29:26

+0

WHERE (1)terr.LDS_DESCRIZIONE_COMUNE = com.DESCRIZIONE 选择1从STG.T_STG_NBA_DT_S_ASSET_G a其中a.owner_accnt_id = CLI.IDC_CLIENTE_CRM_KEY和status_cd( 2)AND com.CODICE_ISTAT = ind_for.x_cod_istat (3)AND ind_for.row_id = cforn.PR_ADDR_ID (4)and cforn.row_id = A.serv_acct_id (5)??? – 2014-12-03 10:39:25

回答

0

选择子句中的子选择会严重妨碍您的表现。试着摆脱它。

你可以做这样的事情

SELECT DISTINCT 
      --a.row_id FK_SERVIZIO, 
      --CLI_UNICO.FK_CLIENTE FK_CLIENTE, 
      CLI.CDC_FISCALE CDC_FISCALE, 
      --com.descrizione 
      --CASE WHEN conc.COMUNE IS NOT NULL THEN 1 ELSE 0 END FL_OFFERTABILITA_GAS 
      decode(test.cnt, 0 'NO', 'SI') FLC_COMUNE_TERR 

FROM  STG.T_STG_NBA_DT_S_ASSET_G A, 
     STG.T_STG_PSP_DT_LISTA_COMUNI_TERR terr, 
     STG.T_STG_NBA_DT_R2DG_COMUNI_G com, 
     STG.T_STG_NBA_DT_S_ADDR_PER_G ind_for, 
     --STG.V_DML_NBA_SITO q, 
     ODS.T_ODS_CRM_DT_CLIENTI_CRM CLI,--ODS.V_ODS_NBA_DT_ASS_CLI_CLIUNICO CLI_UNICO, 
     STG.T_STG_NBA_DT_S_ORG_EXT_G cforn, 
     --STG.T_STG_NBA_DT_R2DG_CONCESS_G conc, 
     (select count(*) cnt from STG.T_STG_NBA_DT_S_ASSET_G a where a.owner_accnt_id=CLI.IDC_CLIENTE_CRM_KEY and status_cd in ('ATTIVATO')) test 


WHERE 

    --CLI.IDC_CLIENTE_CRM_KEY=A.OWNER_ACCNT_ID 
    terr.LDS_DESCRIZIONE_COMUNE=com.DESCRIZIONE 
    AND com.CODICE_ISTAT=ind_for.x_cod_istat 
    AND ind_for.row_id = cforn.PR_ADDR_ID 
    and cforn.row_id=A.serv_acct_id