2

我在以下查询上运行 sql 分析器

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

4 回答 4

2

您正在对 tarInvoice 聚集索引进行完整扫描(触摸每个索引条目),看看您是否可以删除函数调用 dbo._fnStripLeadZeros(ti.TranNo) 以便它使用索引。

可能在 bl.Invoice_Number 上添加前导零并加入未更改的 ti.TranNo

编辑

添加不带前导零的计算列并添加索引:

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
于 2009-05-07T19:42:16.180 回答
0

尝试将远程服务器添加为链接服务器

于 2009-05-07T19:26:51.473 回答
0

只使用了一个本地表,因此您可以将更多查询转移到另一台服务器:

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

不确定确切的语法,只是试图指出可能的改进方向。

于 2009-05-07T19:27:27.120 回答
0

我还建议,如果您必须在查询中转换数据,例如:CONVERT(decimal(15,2), bl.Invoice_Amount),那么您需要考虑重构您的数据库以使用正确的数据类型。

于 2009-05-07T21:01:54.287 回答