INDEX SCAN - Производительность - PullRequest
0 голосов
/ 03 июля 2018

Как улучшить производительность скрипта ниже?

Перед этим сценарием есть переменная объявления таблицы, но стоимость сценариев до этого на самом деле не влияет на мой план выполнения.

INSERT INTO @orders
SELECT TOP 1
      [lid_m]
    , [merchantid]
    , [purchaseAmount]
    , [currencyNumber]
    , [exponent]
    , [data]
    , [orderDesc]
    , [installTotalTrans]
    , [payment_type]
    , [valorParcela]
    , [status]
    , [cctype]
    , [prazoDebito]
    , [recurringExpire]
    , [recurringFrequency]
    , [captureNow]
    , [errorDetail]
    , [ccname]
    , [ccemail]
    , [acceptedTypes]
    , [totalSemJuros]
    , [Portal]
    , [SFCliente]
    , [visatid]
    , [RetornoTecBan]
    , [OrderIdTecBan]
    , [NSULojaTecBan]
    , [NSUTecBan]
    , [DataTecBan]
    , [HoraTecBan]
    , [obs]
    , [telefone]
    , [Protocolo]
    , [CdAgencia]
    , [CdConta]
    , [TituloFinanc]
    , [ValorPago]
    , [DataPagamento]
    , [UpdateDate]
    , [AutorizationType]
    , [errorLB]
    , [idLojaFidelity]
    , [nit]
    , [merchantKey]
    , [codigo_credenciado]
    , P.ID_TIPO_MEIO_PAGAMENTO      
    , [ID_MEIO_PAGAMENTO] = CASE  WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                        AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                        AND O.STATUS > 12
                                        THEN 6
                                    WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                        AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                        AND O.STATUS <= 12
                                        THEN 5                                                  
                                    ELSE P.ID END                       
    , [TIPO_MEIO_PAGAMENTO] = CASE  WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) THEN (SELECT TOP 1 TIPO FROM TB_TIPO_MEIO_PAGAMENTO  WITH (NOLOCK) WHERE ID = 300) ELSE M.TIPO END
    , [MEIO_PAGAMENTO] = CASE  WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                    AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                    AND O.STATUS > 12
                                    THEN (SELECT TOP 1 MEIO_PAGAMENTO FROM TB_MEIO_PAGAMENTO  WITH (NOLOCK) WHERE ID = 6) 
                                WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                    AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                    AND O.STATUS <= 12
                                    THEN (SELECT TOP 1 MEIO_PAGAMENTO FROM TB_MEIO_PAGAMENTO  WITH (NOLOCK) WHERE ID = 5)                                                   
                                ELSE P.MEIO_PAGAMENTO END
    , [MEIO_PAGAMENTO_DESC] = CASE WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                    AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                    AND O.STATUS > 12
                                    THEN (SELECT TOP 1 DESCRICAO FROM TB_MEIO_PAGAMENTO  WITH (NOLOCK) WHERE ID = 6) 
                                WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                    AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                    AND O.STATUS <= 12
                                    THEN (SELECT TOP 1 DESCRICAO FROM TB_MEIO_PAGAMENTO  WITH (NOLOCK) WHERE ID = 5)    
                                ELSE P.DESCRICAO     END        
    , S.DESCRICAO
    , M1.ID_CREDENCIAMENTO
    , ISNULL(M1.CHAVE_MEIO_PAGAMENTO, '')
    , COD.MENSAGEM_AMIGAVEL
FROM ORDERS AS O WITH(NOLOCK) 
LEFT JOIN TB_MEIO_PAGAMENTO AS P  WITH (NOLOCK) 
ON O.PAYMENT_TYPE  = P.ID_TIPO_MEIO_PAGAMENTO 
AND (CASE WHEN O.CCTYPE IS NULL 
            OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0 
            OR UPPER(LTRIM(RTRIM(O.CCTYPE))) = 'APPLET' 
            OR UPPER(LTRIM(RTRIM(O.CCTYPE))) = '101'    
            OR O.CCTYPE LIKE '%Certless%'   
            THEN '1' 
ELSE (CASE WHEN O.CCTYPE = CAST(P.ID AS VARCHAR) THEN 1 ELSE 0 END) END) = '1'

LEFT JOIN TB_TIPO_MEIO_PAGAMENTO AS M WITH(NOLOCK)
ON O.PAYMENT_TYPE = M.ID

LEFT JOIN TB_STATUS_MEIO_PAGAMENTO AS S WITH (NOLOCK)
ON O.STATUS = S.CODIGO AND S.ID_MEIO_PAGAMENTO = CASE  WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                AND O.STATUS > 12
                                THEN 6
                            WHEN P.ID_TIPO_MEIO_PAGAMENTO = 300 
                                AND (O.CCTYPE IS NULL OR LEN(LTRIM(RTRIM(O.CCTYPE))) = 0) 
                                AND O.STATUS <= 12
                                THEN 5                                                      
                            ELSE P.ID END

LEFT JOIN TB_CODIGO_OPERACAO AS COD WITH (NOLOCK)
ON O.ERRORDETAIL = COD.CODIGO

LEFT JOIN TB_MERCHANT_MEIO_PAGAMENTO AS M1 WITH(NOLOCK)
on M1.MERCHANT_ID COLLATE SQL_AltDiction_CP850_CI_AS = O.MERCHANTID COLLATE SQL_AltDiction_CP850_CI_AS
and M1.ID_MEIO_PAGAMENTO = P.ID
AND M1.ID_TIPO_MEIO_PAGAMENTO = P.ID_TIPO_MEIO_PAGAMENTO    

WHERE O.MERCHANTID = @MERCHANTID
AND   O.LID_M = @LID_M

DECLARE @MIN_DATE DATETIME
SET @MIN_DATE = CAST(-53690 AS DATETIME)




    SELECT TOP 1
          O.MERCHANTID
        , O.LID_M
        , O.ID_CREDENCIAMENTO
        , O.CHAVE_MEIO_PAGAMENTO    
        , O.DATA
        , O.DATAPAGAMENTO
        , ISNULL(O.UPDATEDATE, @MIN_DATE) AS UPDATEDATE
        , O.PURCHASEAMOUNT
        , O.VALORPARCELA            
        , O.VALORPAGO   
        , O.TOTALSEMJUROS
        , BANCO = '237'
        , O.CCNAME 
        , O.CCEMAIL 
        , O.PRAZODEBITO 
        , O.ORDERIDTECBAN
        , O.NSULOJATECBAN
        , O.NSUTECBAN
        , O.HORATECBAN
        , O.INSTALLTOTALTRANS       
        , O.STATUS
        , O.DESCRICAO AS [STATUS_DESC]  
        , O.ERRORDETAIL
        , O.MENSAGEM_AMIGAVEL AS [ERROR_MESSAGE]
        , O.CAPTURENOW

        --Financiamento (400)
        , O.ORDERDESC
        , O.PROTOCOLO
        , O.TITULOFINANC
        , NULL AS IDLOJAFIDELITY

        , O.VISATID
        , O.PORTAL

        , O.PAYMENT_TYPE
        , O.CCTYPE
        , O.ID_TIPO_MEIO_PAGAMENTO      
        , O.ID_MEIO_PAGAMENTO
        , O.TIPO_MEIO_PAGAMENTO
        , O.MEIO_PAGAMENTO
        , O.MEIO_PAGAMENTO_DESC
        , APP_UPDATE = ''

        , NULL AS AUTH_CODE
        , NULL AS AUTHORIZATIONS_AUTHORIZEDIDFIDELITY
        , NULL AS AUTHORIZATIONS_TIDFIDELITY
        , NULL AS AUTHORIZATIONS_ESITEFUSNFIDELITY
        , NULL AS AUTHORIZATIONS_MESSAGEFIDELITY

        , NULL  AS CAPTURA_XID
        , @MIN_DATE AS CAPTURA_DATA
        , NULL  AS CAPTURA_RESPONSE
        , NULL  AS CAPTURA_RESSIGN
        , NULL  AS CAPTURA_BATCHID
        , NULL  AS CAPTURA_STATUS
        , NULL  AS CAPTURA_REQITEMS
        , NULL  AS CAPTURA_VISANET_COD
        , NULL  AS CAPTURA_VISANET_ARS
        , NULL  AS CAPTURA_VISANET_CAPMOEDA
        , NULL  AS CAPTURA_VISANET_CAPVALOR
        , NULL  AS CAPTURA_VISANET_CAPEXPO
        , NULL  AS CAPTURA_VISANET_TID

        --BOLETO
        , B.cedente AS BOLETO_CEDENTE
        , B.numero_agencia AS BOLETO_NUMERO_AGENCIA
        , B.numero_conta AS BOLETO_NUMERO_CONTA
        , B.data_emissao AS BOLETO_DATA_EMISSAO
        , B.data_processamento AS BOLETO_DATA_PROCESSAMENTO
        , B.data_vencimento AS BOLETO_DATA_VENCIMENTO       
        , B.nome_sacado AS BOLETO_NOME_SACADO
        , B.endereco_sacado AS BOLETO_ENDERECO_SACADO
        , B.cidade_sacado AS BOLETO_CIDADE_SACADO
        , B.uf_sacado AS BOLETO_UF_SACADO
        , B.cep_sacado AS BOLETO_CEP_SACADO
        , B.cpf_cgc_sacado AS BOLETO_CPF_CGC_SACADO
        , B.numero_pedido AS BOLETO_NUMERO_PEDIDO
        , B.Num_documento AS BOLETO_NUMERO_DOCUMENTO
        , B.valor_documento AS BOLETO_VALOR_DOCUMENTO       
        , B.shoppingid AS BOLETO_SHOPPINGID
        , B.moeda AS BOLETO_MOEDA
        , B.local_pagamento1 AS BOLETO_LOCAL_PAGAMENTO1
        , B.local_pagamento2 AS BOLETO_LOCAL_PAGAMENTO2
        , B.especie_doc AS BOLETO_ESPECIED_DOC
        , B.aceite AS BOLETO_ACEITE
        , B.uso_banco AS BOLETO_USO_BANCO
        , B.cip AS BOLETO_CIP
        , B.carteira_cobranca AS BOLETO_CARTEIRA_COBRANCA
        , B.especie_moeda AS BOLETO_ESPECIE_MOEDA
        , B.quantidade AS BOLETO_QUANTIDADE
        , B.valor AS BOLETO_VALOR
        , B.ano_nosso_num AS BOLETO_ANO_NOSSO_NUM
        , B.assinatura1 AS BOLETO_ASSINATURA1
        , B.assinatura2 AS BOLETO_ASSINATURA2
        , B.data_geracao AS BOLETO_DATA_GERACAO
        , B.sf_id AS BOLETO_SF_ID
        , B.NumDoc AS BOLETO_NUM_DOC
        , B.instrucao1 AS BOLETO_INSTRUCAO1
        , B.instrucao2 AS BOLETO_INSTRUCAO2     
        , B.instrucao3 AS BOLETO_INSTRUCAO3
        , B.instrucao4 AS BOLETO_INSTRUCAO4
        , B.instrucao5 AS BOLETO_INSTRUCAO5
        , B.instrucao6 AS BOLETO_INSTRUCAO6
        , B.instrucao7 AS BOLETO_INSTRUCAO7
        , B.instrucao8 AS BOLETO_INSTRUCAO8
        , B.instrucao9 AS BOLETO_INSTRUCAO9
        , B.instrucao10 AS BOLETO_INSTRUCAO10
        , B.instrucao11 AS BOLETO_INSTRUCAO11
        , B.instrucao12 AS BOLETO_INSTRUCAO12
        , B.instrucao13 AS BOLETO_INSTRUCAO13
        , ISNULL(B.REF_GEN_PARAM_KEY, '')   AS REF_GEN_PARAM_KEY
        , [URL_API_BOLETO] = @URL_API_BOLETO
        , [IS_NOVO_BOLETO] = CASE WHEN B.REF_GEN_PARAM_KEY IS NOT NULL AND LEN(B.REF_GEN_PARAM_KEY) > 0
                                        THEN 
                                            1                                               
                                        ELSE 
                                            0 
                                        END
        , [COMB_BOLETO_VELHO] = CASE WHEN B.REF_GEN_PARAM_KEY IS NOT NULL AND LEN(B.REF_GEN_PARAM_KEY) > 0
                                        THEN 
                                            ''                                              
                                        ELSE  
                                            (SELECT hash FROM COMERCIO_BOLETO_HASH 
                                                WHERE merchantid COLLATE SQL_AltDiction_CP850_CI_AS = O.MERCHANTID COLLATE SQL_AltDiction_CP850_CI_AS
                                                    AND lid_m COLLATE SQL_AltDiction_CP850_CI_AS = O.LID_M COLLATE SQL_AltDiction_CP850_CI_AS) 
                                        END 
    FROM @orders AS O   
    -- consulta a boletos se o meio de pagamento for 300
    LEFT JOIN TB_BOLETOS AS B WITH (NOLOCK ,index ([IX_tb_boletos3]))
    ON 
        O.MERCHANTID  COLLATE SQL_AltDiction_CP850_CI_AS = B.MERCHANTID COLLATE SQL_AltDiction_CP850_CI_AS 
        AND O.LID_M COLLATE SQL_AltDiction_CP850_CI_AS = B.LID_M COLLATE SQL_AltDiction_CP850_CI_AS                                     
    WHERE O.MERCHANTID = @MERCHANTID
    AND   O.LID_M = @LID_M

И мои планы выполнения извлекают его:

enter image description here


решаемые

Что я сделал?

Я проверил, что в Плане выполнения есть вычислительный скаляр, потому что параметры табличной переменной и таблицы различаются. Я изменил параметры сортировки таблицы и смог это исправить.

Также я создал UNIQUE CLUSTERED для таблицы переменных, чтобы получить Index Seek

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...