我有以下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