我有以下数据库结构(简化):
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 小时开始运行 - 我在查询中做错了什么还是有办法加快它的速度?
它不需要非常快,因为它是一次性任务,但对我来说几个小时似乎很长,因为我想学习(希望不会发生)下次我想要一些反馈如何改进......