1

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

这是我的困境:我有适度的 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 我认为执行计划的瓶颈

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

4

2 回答 2

2

您不能与 dbo.InvTransTable2 进行匹配,因为您从中选择了所有记录,所以它会留下扫描记录。

  1. 确保您在 OMCXIT00 上有聚集索引,看起来它是一个堆,没有聚集索引。确保聚集索引很小,但其中包含更多不同的值。
  2. 如果您没有太多记录 OMCXIT00,则使用关键 ITCO 创建索引并在 include 中包含以下列( ITITDJ 、 ITIREF 、 ITWH 、ITCO 、ITIM 、ITLOT )可能就足够了

索引创建示例:

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

                      A.ITCO = B.ITCO
                      AND A.ITWH = B.ITWH
                      AND A.ITIM = B.ITIM
                      AND A.ITLOT = B.ITLOT 
    
于 2012-11-15T16:02:11.630 回答
0

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

于 2012-11-16T18:55:46.260 回答