Анализатор запросов tsql: как снизить «стоимость»? - PullRequest
2 голосов
/ 07 мая 2009

я запускаю sql analyzer по следующему запросу

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

Запрос выполняется на сервере [App] и подключается к серверу [Conn] sql для выполнения объединения. и диаграмма говорит мне

remote query cost : 62%
customered index scan [App].[dbo].tarInvoice.[PK__...  Cost : 34% 

Выполнение этого запроса занимает 2 минуты. Любые идеи о том, как бы я выяснить, как сделать это работать более эффективно? Я предполагаю, что это связано с подключением к другому серверу sql в той же сети.

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 07 мая 2009

вы делаете полное сканирование кластерного индекса tarInvoice (коснитесь каждой записи индекса), посмотрите, можете ли вы удалить вызов функции dbo._fnStripLeadZeros (ti.TranNo), чтобы он использовал индекс.

возможно добавить начальные нули в bl.Invoice_Number и присоединиться к неизмененному ti.TranNo

EDIT

добавить вычисляемый столбец без начальных нулей и добавить индекс:

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
0 голосов
/ 08 мая 2009

Я бы также посоветовал вам преобразовать данные в таких запросах, как: КОНВЕРТ (десятичное число (15,2), бл. Счет-фактуры) тогда вам нужно подумать о рефакторинге вашей базы данных, чтобы использовать правильный тип данных.

0 голосов
/ 07 мая 2009

Используется только одна локальная таблица, поэтому вы можете перенести больше запросов на другой сервер:

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

Не уверен насчет точного синтаксиса, просто пытаюсь указать направление возможного улучшения.

0 голосов
/ 07 мая 2009

Попробуйте добавить удаленный сервер как связанный сервер .

...