我是这个网站的新手,但请不要反对我。我只使用过一次。
这是我的困境:我有适度的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
答案 0 :(得分:2)
你无法与dbo.InvTransTable2匹配,因为你从中选择了所有记录,所以它将被留下扫描记录。
索引创建示例:
CREATE INDEX IX_dbo_OMCXIT00
ON OMCXIT00 ([ITCO])
INCLUDE ( ITITDJ , ITIREF)
如果它没有帮助,那么您需要查看正在搜索的谓词中的哪些列具有更多不同的值,并使用键中的一个或一些创建索引,并确保在其中重新排序谓词顺序子句。
A.ITCO = B.ITCO
AND A.ITWH = B.ITWH
AND A.ITIM = B.ITIM
AND A.ITLOT = B.ITLOT
答案 1 :(得分:0)
除了添加索引以更改索引查找的表扫描之外,还要问自己:“我真的需要这个sql代码中的命令吗?”。如果您不排除此排序,请从您的SQL代码中删除顺序。接下来,您的代码很有可能会更快。