Pergunta

Estou correndo analisador sql na seguinte consulta

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top