none
Otimização de Consulta RRS feed

  • Pergunta

  • Boa tarde Galera!

     

    Recebi esta consulta para desenvolver um relatório e gostaria da opinião dos mais experientes para melhorar o desempenho das mesma. Caso precise de acesso ao banco, poderei disponibilizar a base de homologação.

    SELECT  IsNull(Case When STO.NM_SET Is Null Then RST.CD_CUS_CLI Else STO.NM_SET End, '') As NM_SET, 
    IsNull(STO.IS_SET, 0) As IS_SET, FORN.IS_FOR, FORN.NM_FOR_RED As Fornecedor, MST.NM_MST_PAX As Passageiro, 
    Convert(char(10),RST.CD_RST,103) As Reserva, Convert(char(10),RST.DT_RST_EMI,103) As Emissao,  
    Cast(MST.VL_MST_TAR As Decimal(15,2)) As Vl_Original, MST.NM_MST_MOE As Moeda, MST.VL_MST_CAM As Cambio, 
    MST.NR_MST_BIL, MST.NR_MST_OPV,  MST.NR_MST_VIA AS Solicitacao, Convert(char(10),TRE.DT_TRE_SAI,103) As Saida,  
    Convert(char(10),MST.DT_MST_ENT,103) As Dt_Entrada, Convert(char(10),MST.DT_MST_SAI,103) As Dt_Saida,  
    Cast(IsNull(MST.VL_MST_TAR, 0) * IsNull(MST.VL_MST_CAM, 0) As Decimal(15,2)) As Valor, TRE.NM_TRE As Rota, 
    SER.NM_SER_CLA As Produto, MST.NM_MST_CP2 As Complemento, Cast(IsNull(MST.VL_MST_TAX_FAT, 0) As Decimal(15,2)) As Taxas, 
    Cast(IsNull(MST.VL_MST_FEE, 0) As Decimal(15,2)) As Taxa_Servico, Cast(IsNull(MST.VL_MST_DES, 0) As Decimal(15,2)) As Desconto,
    Cast(Case When RST.CD_RST_FPG <> 6 Then
    -- CASO TENHA DESCONTO, EXIBIR.
    IsNull(MST.VL_MST_TAR, 0) * IsNull(MST.VL_MST_CAM, 0) + IsNull(MST.VL_MST_FEE, 0) + IsNull(MST.VL_MST_TAX_FAT, 0) + IsNull(MST.VL_MST_TDU, 0) - IsNull(MST.VL_MST_DES, 0)

    Else IsNull(MST.VL_MST_TEX, 0) End As Decimal(15,2)) As Total, 
    isnull(MST.DS_MST_OB1, '') +  ' ' + isnull(MST.DS_MST_OB2, '') As Observacao, 
    IsNull(MST.VL_MST_TDU, 0) As Taxas_Repasse, RST.NR_RST_RES As Integracao, 
    CLI.TP_CLI_DED_ISS, CLI.TP_CLI_INC_ISS_TDU, CLI.TP_CLI_INC_ISS_TSE, 

    (SELECT T02.TX_IEM FROM T_IMP T01, T_IEM T02 WHERE T01.IS_IMP = T02.IS_IMP AND T01.TP_IMP = 1 AND T02.IS_EMP = RST.NR_RST_EST 
    AND T02.DT_IEM = (SELECT MAX(T99.DT_IEM) FROM T_IEM T99 WHERE T99.IS_EMP = T02.IS_EMP AND T99.IS_IMP = T02.IS_IMP AND T99.DT_IEM <= RST.DT_RST_EMI)) AS TX_IEM 

    From T_RST RST WITH (NOLOCK)
    Join T_MST MST WITH (NOLOCK) On RST.IS_RST = MST.IS_RST  
    Join T_CLI CLI WITH (NOLOCK) On RST.CD_RST_CLI = CLI.IS_CLI  
    Join T_FOR FORN WITH (NOLOCK)On RST.CD_RST_FSE = FORN.IS_FOR  
    Join T_SER SER WITH (NOLOCK) On RST.CD_RST_PRO = SER.IS_SER  
    Left Join T_SET STO WITH (NOLOCK) On RST.IS_SET = STO.IS_SET  
    Left Join T_TRE_AUX TRE WITH (NOLOCK) On RST.IS_RST = TRE.IS_RST And MST.NR_MST_BIL = TRE.NR_TRS_BIL

    Where RST.NR_RST_FAT = 'FT00000125'
    Order By FORN.NM_FOR



    • Editado Perdoeis quinta-feira, 19 de junho de 2014 01:25
    quarta-feira, 18 de junho de 2014 22:05

Respostas

Todas as Respostas

  • Deleted
    quarta-feira, 18 de junho de 2014 23:12
  • José,

    Eu não tenho experiencia suficiente para realizar este trabalho, pois meu foco é desenvolvimento em PHP. Por isso que estou pedindo a opinião dos experientes. Esta consulta é uma procedure que já veio no banco de dados do cliente.

    quinta-feira, 19 de junho de 2014 01:27
  • Pedro,

    Vamos por partes, você chegou o Plano de Execuçã(Execution Plan) para verificar em quais partes sua query esta levando mais tempo de processamento?

    Este recurso esta disponível dentro do Management Studio.

    Agora um pergunta, suas tabelas estão definidas com chaves primárias?

    Os campos declarados nos Joins possuem chaves?

    Os campos declarados não Where apresentam ou possuem índices?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    quarta-feira, 25 de junho de 2014 17:32