1

我有一个执行时间过长的查询。我需要知道是否有任何最佳的执行方式来减少执行时间。

我的查询是

SELECT     TOP (2) ID,
                   (
                    SELECT     SUM(CurrentStock) AS SimilarItemQuantity
                    FROM          Inventory AS T1
                    WHERE      (Inventory.ProductName = ProductName)
                   ) 
                   AS Expr1
FROM         Inventory

考虑到 20 条记录,它需要 15 秒。有没有更快的方法来做到这一点。

4

4 回答 4

3

相关子查询是一种 SQl 反模式,它们几乎总是可以被连接替换并加快进程。您应该在选择 top X 时添加 order by 子句,否则结果将不一致。

SELECT TOP 2 I1.ID, SUM(I2.CurrentStock) AS SimilarItemQuantity  
FROM   Inventory I1
join   Inventory I2 on I1.ProductName = I2.ProductName
GROUP BY I1.ID
ORDER BY I1.ID
于 2012-05-30T15:42:50.693 回答
0

Inventory.ProductName在(键列)上添加索引并包含CurrentStockID包含列)列。

CREATE NONCLUSTERED INDEX [Inventory_IDX_ProductName] ON [dbo].[Inventory]
(
  [ProductName] ASC
)
INCLUDE ( [CurrentStock],[ID]) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
于 2012-05-30T15:44:24.633 回答
0
于 2012-05-30T19:02:26.317 回答
0

您可以考虑通过以下方式将其重写为一个组:

select top 2 id, sum(CurrentStock)
from Inventory i
group by id, ProductName
order by 2 desc

这是假设您想要当前库存最大的两个 id。

通常,您将 TOP 与 order by 一起使用。

而且,正如其他人所提到的,在 (id, ProductName) 上有一个索引会有所帮助:

create index idx_inventory_id_ProductName on inventory(id, ProductName)
于 2012-05-30T15:47:57.197 回答