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アンチパターンであり、ほとんどの場合、結合に置き換えてプロセスを高速化できます。トップ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

これをグループとして次のように書き直すことを検討してください。

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

これは、現在の在庫が最大の2つのIDが必要であることを前提としています。

通常、TOPはbyで注文して使用します。

そして、他の人が述べているように、(id、ProductName)にインデックスを付けると次のようになります。

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

Inventory.ProductNameキー列)にインデックスを追加し、CurrentStockおよびID含まれる列)列を含めます。

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 に答える