Sql server 索引扫描-性能

Sql server 索引扫描-性能,sql-server,tsql,indexing,Sql Server,Tsql,Indexing,如何提高下面脚本的性能 在此脚本之前,有一个declare table变量,但之前脚本的成本并不会真正影响我的执行计划 INSERT INTO @orders SELECT TOP 1 [lid_m] , [merchantid] , [purchaseAmount] , [currencyNumber] , [exponent] , [data] , [orderDesc] , [installTotalTrans]

如何提高下面脚本的性能

在此脚本之前,有一个declare table变量,但之前脚本的成本并不会真正影响我的执行计划

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
我的执行计划检索到它:

解决了的 我做了什么

我检查了执行计划中有计算标量的表,因为表变量和表的排序规则是不同的。我更改了表的排序规则,可以修复它


我还创建了唯一的聚集变量表来获取索引Seek

如果这个表只有一条记录,为什么要加入@orders?这个索引是如何组成的:Index[IX_tb_boletos3],它是否有MERCHANT_ID和LID_M字段?为什么你要强制使用它,而不是让数据库选择可用的最佳方法?@jaimedrq并不是只有一条记录。有一个收集1个recordTop 1的过程,但没有order by是不确定的。整个查询非常混乱,令人困惑-这似乎是几个开发人员随着时间的推移在一个查询上构建的工作。你最好把它清理干净。我不确定您认为它在做什么,如果没有模式和示例数据(例如,在SQL FIDLE中),很难提供帮助。如果您的商户id和lid是整数,则collate语句没有意义。