私は次のDB構造を持っています(簡略化):
Payments
----------------------
Id | int
InvoiceId | int
Active | bit
Processed | bit
Invoices
----------------------
Id | int
CustomerOrderId | int
CustomerOrders
------------------------------------
Id | int
ApprovalDate | DateTime
ExternalStoreOrderNumber | nvarchar
各顧客注文には請求書があり、各請求書には複数の支払いを含めることができます。これExternalStoreOrderNumber
は、注文をインポートした外部パートナーストアからの注文と、ApprovalDate
そのインポートが行われたときのタイムスタンプへの参照です。
今、私たちは間違ったインポートをして、次のロジックに従って他の請求書にいくつかの支払いを変更する必要があるという問題があります(数百、手で行うにはあまりにもマッハです):
同じ外部番号を持つ注文の請求書を検索します現在のものと同じですが、現在の数字ではなく0から始まります。
そのために、次のクエリを作成しました。
UPDATE DB.dbo.Payments
SET InvoiceId=
(SELECT TOP 1 I.Id FROM DB.dbo.Invoices AS I
WHERE I.CustomerOrderId=
(SELECT TOP 1 O.Id FROM DB.dbo.CustomerOrders AS O
WHERE O.ExternalOrderNumber='0'+SUBSTRING(
(SELECT TOP 1 OO.ExternalOrderNumber FROM DB.dbo.CustomerOrders AS OO
WHERE OO.Id=I.CustomerOrderId), 1, 10000)))
WHERE Id IN (
SELECT P.Id
FROM DB.dbo.Payments AS P
JOIN DB.dbo.Invoices AS I ON I.Id=P.InvoiceId
JOIN DB.dbo.CustomerOrders AS O ON O.Id=I.CustomerOrderId
WHERE P.Active=0 AND P.Processed=0 AND O.ApprovalDate='2012-07-19 00:00:00'
今、私はライブデータ(各テーブルで約250.000行)を使用してテストシステムでそのクエリを開始し、16時間から実行されています-クエリで完全に間違ったことをしましたか、それとも少しスピードアップする方法がありますか?
1回限りの作業であるため、それほど高速である必要はありませんが、数時間は私には長いように思えます。次回は(うまくいけば起こらない)学習したいので、改善方法についてフィードバックをお願いします...