我有以下SQL查询
Declare @tempcalctbl Table
(
ItemId varchar(50),
ItemLocation varchar(50),
ItemNo varchar(50),
Width real,
Unit varchar(50),
date datetime
)
Insert Into @tempcalctbl
Select distinct SubId,ItemLocation,ItemNo,
(ABS((Select width From @temptbl a Where ItemProcess ='P1'and a.ItemId = c.ItemId
and a.ItemNo = c.ItemNo and a.ItemLocation = c.ItemLocation)
-(Select width From @temptbl b Where ItemProcess ='P2' and b.ItemId = c.ItemId
and b.ItemNo = c.ItemNo and b.ItemLocation = c.ItemLocation))) * 1000,
Unit,date
From @temptbl c
Group by ItemId,ItemLocation,ItemNo,Unit,date
我想知道如何优化这个查询。这个想法是找出不同的宽度(p1的项目- p2的项目)之间的ItemProcess ' p1'和' p2'根据相同的ItemID,相同的ItemNo和相同的ItemLocation。我有大约75000个,它花了超过25分钟来获得所有ItemId的宽度差异。
我试图使用组的宽度不同的计算,但它会返回多行,而不是只是一个值,然后会返回错误。顺便说一下,我使用MS SQL server 2008和@tempcalctbl是我在存储过程中声明的表。
是否有帮助?
INSERT INTO @tempcalctbl
SELECT P1.SubId ,
P1.ItemLocation ,
P1.ItemNo ,
ABS(P1.Width - P2.Width) * 1000 AS Width ,
P1.Unit ,
P1.date
FROM @temptbl AS P1
INNER JOIN @temptbl AS P2 ON P1.ItemId = P2.ItemId
AND P1.ItemNo = P2.ItemNo
AND P1.ItemLocation = P2.ItemLocation
WHERE P1.ItemProcess = 'P1'
AND P2.ItemProcess = 'P2'
编辑
要使用索引,您需要将表变量更改为临时表
CREATE TABLE #temptbl
(
ItemId varchar(50),
ItemLocation varchar(50),
ItemNo varchar(50),
Width real,
Unit varchar(50),
date DATETIME,
ItemProcess INT,
SubId INT
)
CREATE NONCLUSTERED INDEX Index01 ON #temptbl
(
ItemProcess ASC,
ItemId ASC,
ItemLocation ASC,
ItemNo ASC
)
INCLUDE ( SubId,Width,Unit,date)
GO
John petraeus的回答是这种情况下最好的查询。如果现在速度仍然可以接受,也许您可以将@temptbl存储在临时真实表中,并在这四列上创建相关索引。