SQL Query Analyzer: como você reduzir o “custo”?
-
08-07-2019 - |
Pergunta
Estou correndo analisador sql na seguinte consulta ??p>
SELECT bl.Invoice_Number, bl.Date_Invoice, ti.TranNo, bt.Description,
CONVERT(decimal(15,2), bl.Invoice_Amount) AS Invoice_Amount, co.Company_ID, co.Account_Nbr,
isnull(bl.Reference,' ') as Reference, bl.Billing_Log_RecID AS BillingKey
FROM [CONN.domain.NET].cwwebapp.dbo.Billing_Log bl
LEFT JOIN [App].dob.tarInvoice ti
ON bl.Invoice_Number = dbo._fnStripLeadZeros(ti.TranNo)
INNER JOIN [CONN.domain.NET].cwwebapp.dbo.Billing_Type bt
ON bl.Billing_Type_ID = bt.Billing_Type_ID
LEFT JOIN [CONN.domain.NET].cwwebapp.dbo.Company co
ON bl.Company_RecID = co.Company_RecID
WHERE bl.Date_Invoice >= '2009-05-05'
AND ti.TranNo IS NULL
AND bl.Invoice_Amount <> 0
AND bl.Billing_Type_ID <> 'D'
AND bl.Billing_Type_ID <> 'P'
-- AND bl.Billing_Type_ID <> 'M'
Order By bl.Invoice_Number
A consulta é executada no servidor [App] e se conecta a [Conn] do SQL Server para fazer uma junção eo diagrama está me dizendo
remote query cost : 62%
customered index scan [App].[dbo].tarInvoice.[PK__... Cost : 34%
Esta consulta está tomando 2 minutos para ser executado. Alguma idéia de como eu iria sobre descobrir como fazer isso funcionar mais eficientemente? I "m supondo que tem a ver com a conexão com outro servidor SQL na mesma rede.
Agradecemos antecipadamente.
Solução
você está fazendo uma varredura completa do índice tarInvoice cluster (tocar cada entrada de índice), veja se você pode remover os dbo._fnStripLeadZeros chamada de função (ti.TranNo) para que ele irá usar o índice.
possivelmente adicionar zeros à esquerda para bl.Invoice_Number e junte-se a inalterada ti.TranNo
Editar
adicionar coluna computada sem zeros à esquerda e adicione um índice:
ALTER TABLE dbo.tarInvoice ADD TranNoZeroFree AS Convert(int,TranNo) PERSISTED
GO
CREATE NONCLUSTERED INDEX IX_tarInvoice_TranNoZeroFree ON dbo.tarInvoice (TranNoZeroFree) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Outras dicas
Tente adicionar o servidor remoto como um ligada servidor.
Há apenas uma tabela local a ser utilizado, para que você possa transferir mais da consulta para outro servidor:
select *
from openquery([CONN.domain.NET],'
SELECT bl.Invoice_Number, bl.Date_Invoice, ti.TranNo, bt.Description,
CONVERT(decimal(15,2), bl.Invoice_Amount) AS Invoice_Amount,
co.Company_ID, co.Account_Nbr, isnull(bl.Reference,'' '') as Reference,
bl.Billing_Log_RecID AS BillingKey
FROM cwwebapp.dbo.Billing_Log bl
INNER JOIN cwwebapp.dbo.Billing_Type bt
ON bl.Billing_Type_ID = bt.Billing_Type_ID
LEFT JOIN cwwebapp.dbo.Company co
ON bl.Company_RecID = co.Company_RecID
WHERE bl.Date_Invoice >= ''2009-05-05''
AND bl.Invoice_Amount <> 0
AND bl.Billing_Type_ID <> ''D''
AND bl.Billing_Type_ID <> ''P''
') remote
LEFT JOIN tarInvoice ti
ON remote.Invoice_Number = dbo._fnStripLeadZeros(ti.TranNo)
WHERE ti.TranNo IS NULL
Order By remote.Invoice_Number
Não tenho certeza sobre a sintaxe exata, apenas tentando ponto em uma direção melhoria possível.
Eu também gostaria de sugerir que se você tem que converter os dados em consultas, tais como: CONVERTER (decimal (15,2), bl.Invoice_Amount) então você precisa considerar refatorar seu banco de dados para usar o tipo de dados correto.