SQL查询优化帮助

时间:2011-07-07 01:29:28

标签: sql sql-server database optimization query-optimization

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

我想知道如何优化此查询。 我们的想法是根据相同的ItemID,相同的ItemNo和相同的ItemLocation找出ItemProcess'P1'和'P2'之间的宽度(p1项目 - p2项目)的不同。 我有大约75000,并且花了超过25分钟来获得所有ItemId的宽度差异。

我尝试使用Group by进行宽度不同的计算但是它会返回多行而不是只返回错误的值。顺便说一句,我使用的是MS SQL server 2008,而@tempcalctbl是我在商店程序中声明的表。

2 个答案:

答案 0 :(得分:0)

以下是否有帮助?

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

这应该可以加快你的速度。

答案 1 :(得分:0)

John Petrak的回答是这个案例的最佳查询。 如果速度现在仍然可以接受,也许您可​​以将@temptbl存储在临时实际表中,并在这四列上创建相关索引。