【问题标题】:how to optimize my oracle query?如何优化我的 oracle 查询?
【发布时间】:2015-01-31 20:16:45
【问题描述】:

我的查询很慢,我想优化它。我已经为连接的字段创建了索引。我的查询是这样的:

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.

请问有什么建议吗? 我可以使用并行吗?如何? 谢谢

【问题讨论】:

  • 6 个表,只有 4 个连接对我来说看起来很可疑!
  • 有5个join,还有: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'))
  • WHERE (1) terr.LDS_DESCRIZIONE_COMUNE=com.DESCRIZIONE (2) AND com.CODICE_ISTAT=ind_for.x_cod_istat (3) AND ind_for.row_id = cforn.PR_ADDR_ID (4) 和 cforn.row_id=A .serv_acct_id (5) ???
  • 看看开始:SELECT DISTINCT CLI.CDC_FISCALE CDC_FISCALE, --com.descrizione --CASE WHEN conc.COMUNE IS NOT NULL THEN 1 ELSE 0 END FL_OFFERTABILITA_GAS CASE WHEN 存在(从 STG.T_STG_NBA_DT_S_ASSET_G 中选择 1 a where a.owner_accnt_id=CLI.IDC_CLIENTE_CRM_KEY and status_cd in ('ATTIVATO'))
  • 以及如何修改我的查询?

标签: database oracle performance indexing


【解决方案1】:

选择子句中的子选择会严重影响您的性能。试着摆脱它。

你可以这样做

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

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多