Как улучшить производительность скрипта ниже?
Перед этим сценарием есть переменная объявления таблицы, но стоимость сценариев до этого на самом деле не влияет на мой план выполнения.
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](https://i.stack.imgur.com/mtHia.png)
решаемые
Что я сделал?
Я проверил, что в Плане выполнения есть вычислительный скаляр, потому что параметры табличной переменной и таблицы различаются. Я изменил параметры сортировки таблицы и смог это исправить.
Также я создал UNIQUE CLUSTERED для таблицы переменных, чтобы получить Index Seek