不稳定的查询性能

时间:2012-11-15 14:02:34

标签: sql sql-server tsql sql-server-2005

我是这个网站的新手,但请不要反对我。我只使用过一次。

这是我的困境:我有适度的SQL知识但不是专家。以下查询是很久以前由顾问创建的。

在大多数早晨,运行需要1.5小时,因为有大量数据。但是在其他早晨,需要4-6个小时。我已经尝试删除任何正在运行的作业。我对于试图找出造成这个问题的原因感到很困惑。

任何帮助将不胜感激。

我已经将此查询分解为2个查询,但是有关如何帮助提高性能的任何提示都将非常感激。

此查询会构建我们的库存交易,以查找我们在任何给定时间点的库存现值。

SELECT     
    ITCO, ITIM, ITLOT, Time, ITWH, Qty, ITITCD,ITIREF, 
    SellPrice, SellCost,
    case 
        when Transaction_Cost is null 
        then Qty * (SELECT ITIACT 
                    FROM (Select Top 1 B.ITITDJ, B.ITIREF, B.ITIACT
                          From OMCXIT00 AS B 
                          Where A.ITCO = B.ITCO
                          AND A.ITWH = B.ITWH
                          AND A.ITIM = B.ITIM
                          AND A.ITLOT = B.ITLOT 
                          AND ((A.ITITDJ > B.ITITDJ) 
                               OR (A.ITITDJ = B.ITITDJ AND A.ITIREF <= B.ITIREF))
                          ORDER BY B.ITITDJ DESC, B.ITIREF DESC) as C) 
        else Transaction_Cost
    END AS Transaction_Cost, 
    case when ITITCD = 'S' then ' Shipped - Stock' else null end as TypeofSale,
    case when ititcd = 'S' then ITIREF else null end as OrderNumber
FROM  
    dbo.InvTransTable2 AS A

这是执行计划。 http://i.imgur.com/mP0Cu.png Execution plan bottle neck on sort I think

这是DTA但我不确定如何阅读,因为推荐是空白的。不应该说“创造”? http://i.imgur.com/4ycIP.png

2 个答案:

答案 0 :(得分:2)

你无法与dbo.InvTransTable2匹配,因为你从中选择了所有记录,所以它将被留下扫描记录。

  1. 确保您在OMCXIT00上拥有聚簇索引,它看起来像是堆,没有聚簇索引。 确保聚簇索引很小,但其中包含更多不同的值。
  2. 如果OMCXIT00没有太多记录,则可以使用关键ITCO创建索引,并在include(ITITDJ,ITIREF,ITWH,ITCO,ITIM,ITLOT)中包含以下列。
  3. 索引创建示例:

       CREATE INDEX IX_dbo_OMCXIT00 
                         ON OMCXIT00 ([ITCO])
                        INCLUDE ( ITITDJ , ITIREF)
    
    1. 如果它没有帮助,那么您需要查看正在搜索的谓词中的哪些列具有更多不同的值,并使用键中的一个或一些创建索引,并确保在其中重新排序谓词顺序子句。

                        A.ITCO = B.ITCO
                        AND A.ITWH = B.ITWH
                        AND A.ITIM = B.ITIM
                        AND A.ITLOT = B.ITLOT 
      

答案 1 :(得分:0)

除了添加索引以更改索引查找的表扫描之外,还要问自己:“我真的需要这个sql代码中的命令吗?”。如果您不排除此排序,请从您的SQL代码中删除顺序。接下来,您的代码很有可能会更快。