2012-05-30 195 views
1

我有一個查詢需要很長時間才能執行。 我需要知道是否有任何最佳的執行方式來減少執行時間。SQL查詢優化

我的查詢是

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

認爲,爲20個記錄,它需要15秒。 有沒有更快的方法來做到這一點。

+3

你正在使用哪些DBMS? 「庫存」表上有哪些索引?你看過執行計劃嗎? – mwigdahl

+0

是'Inventory.ProductName'索引? –

+0

它的SQLSERVER沒有庫存表沒有索引。 – Mobin

回答

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 
+1

+1 - 缺少的OrderBy實際上是一個BUG - 你不知道你找回了哪個ID。它現在可能會一致並在一個月內破產。 – TomTom

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 
0

你可能會考慮通過重寫此作爲一個羣體:

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

這是假設你希望兩個ID與當前最大的股票。

通常情況下,您使用TOP進行訂購。

而且,正如其他人所說,有上(ID,產品名稱)的指數,將有助於:

create index idx_inventory_id_ProductName on inventory(id, ProductName) 
0

如何使用聚合窗口功能(SUM(…) OVER …)?

SELECT TOP (2) 
    ID, 
    SUM(CurrentStock) OVER (PARTITION BY ProductName) AS SimilarItemQuantity 
FROM Inventory 

正如其他人已經提到,TOP (n)沒有多大意義沒有ORDER BY。爲了一致性,在這種情況下使用固定的順序,例如, ORDER BY ID