我有以下DB結構(簡體):如何提高SQL查詢性能
Payments
----------------------
Id | int
InvoiceId | int
Active | bit
Processed | bit
Invoices
----------------------
Id | int
CustomerOrderId | int
CustomerOrders
------------------------------------
Id | int
ApprovalDate | DateTime
ExternalStoreOrderNumber | nvarchar
每個客戶訂單都有發票,每張發票可以有多個付款。 ExternalStoreOrderNumber
是來自我們從外部合作伙伴商店導入訂單的訂單的參考,以及導入發生時的時間戳ApprovalDate
。
現在我們根據以下邏輯有,我們有一個錯誤的進口的需要更改爲其他發票的某些款項(幾個hundert,這樣太馬赫做手工)問題:
搜索訂單的發票它具有與當前數字相同的外部數字,但以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小時,它現在正在運行 - 我在查詢中做了一些完全錯誤的事情,還是有辦法加快它的速度?
由於這是一次性任務,因此不需要很快,但幾個小時對我來說似乎很長,並且我希望下一次我希望學習(希望不會發生),我希望有一些反饋如何改進...
非常感謝 - 您的查詢在<1s中完成了這項工作,並感謝您的解釋,我也學到了很多東西。 – ChrFin