tsqlクエリアナライザー:どのように“コスト”を削減しますか?
-
08-07-2019 - |
質問
次のクエリで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サーバーへの接続に関係していると思います。
事前に感謝します。
解決
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
他のヒント
リンクサーバーとしてリモートサーバーを追加してください。
使用されているローカルテーブルは1つだけなので、クエリの多くを他のサーバーに移動できます。
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
正確な構文についてはわかりませんが、改善の方向性を指摘しようとしています。
次のようなクエリでデータを変換する必要がある場合もお勧めします。 CONVERT(decimal(15,2)、bl.Invoice_Amount) 正しいデータ型を使用するようにデータベースをリファクタリングすることを検討する必要があります。
所属していません StackOverflow