0

我为 SRSS 报告编写了一个查询,该报告应该从 maximo 检索项目列表。

它包括库存物品的数量,是否有收到和/或发出日期(如果有,最晚日期是什么)以及当时的单位成本。

尽管它返回了我想要的东西,但它运行得非常慢,以至于当它在报告中使用时,它似乎永远不会加载。5000 行需要 21 秒(maximo 中已经有 > 100k 个事务!)。我怎样才能退回单位成本以使其更快?它在没有单位成本行的情况下运行得很快。

询问

select top 5000 item.commoditygroup, item.itemnum, item.description, item.commodity, inventory.location, inventory.siteid,
(select sum(curbal) from invbalances where item.itemnum = invbalances.itemnum group by itemnum) CurrentBalance,
(select max(Convert(varchar(10), matrectrans.transdate, 103)) from matrectrans 
where item.itemnum = matrectrans.itemnum and matrectrans.issuetype='RECEIPT') ReceivedDate,
(Select m1.unitcost from matrectrans m1 
where m1.transdate = (select max(m2.transdate)from matrectrans m2 where item.itemnum = m2.itemnum and m2.issuetype='RECEIPT' and linecost <> 0)) RecievedUnitCost,
(select max(Convert(varchar(10), matusetrans.transdate, 103)) from matusetrans 
where item.itemnum = matusetrans.itemnum and matusetrans.issuetype='ISSUE') IssueDate,
(Select m3.unitcost from matusetrans m3 
where m3.transdate = (select max(m4.transdate)from matusetrans m4 where item.itemnum = m4.itemnum and m4.issuetype='ISSUE' and linecost <> 0)) IssuedUnitCost
from item, inventory
where item.itemnum = inventory.itemnum

谢谢

4

3 回答 3

1

谢谢大家 - 我最终得到了这个运行得更快的查询(它在 2 秒内获得 10000 条记录)

select distinct inventory.itemnum, item.commodity, item.commoditygroup, inventory.siteid, inventory.location, inventory.itemsetid, 
item
.description as itemDesc, inventory.issueunit as iUnit,


(select max(actualdate) from matusetrans 

where issuetype in (select value from synonymdomain where domainid = 'ISSUETYP' and maxvalue = 'ISSUE') 

and siteid=inventory.siteid and storeloc=inventory.location and itemsetid=inventory.itemsetid and itemnum=inventory.itemnum) as useTransDate,


(select max(actualdate) from matrectrans 

where issuetype in (select value from synonymdomain where domainid = 'ISSUETYP' and maxvalue = 'RECEIPT')

and siteid=inventory.siteid and tostoreloc=inventory.location and itemsetid=inventory.itemsetid and itemnum=inventory.itemnum 

) as recTransDate 
from

inventory inner join item on inventory.itemsetid = item.itemsetid and inventory.itemnum = item.itemnum 
where

item.itemtype in ( select value from synonymdomain where domainid = 'ITEMTYPE' and maxvalue in ('ITEM') ) 

and inventory.status not in ( select value from synonymdomain where domainid='ITEMSTATUS' and maxvalue in ('OBSOLETE') )
于 2014-04-07T16:07:37.407 回答
1

对于每个项目的所有这些子查询,dbms 有很多工作要做。所以不要指望这会很快。我想您已经确保这些表具有适当的索引。

所以我认为加快速度的唯一机会是让 dbms 尽快找到这 5000 条记录。实际上,您不使用 order by,因此您只需获得 5000 个随机库存。对于结果列表中的一项,您可能会获得所有库存或仅其中一些,这都是随机的。

知道了这一点,您可以选择 5000 个随机库存,并且只有在找到这些后,才加入项目:

select 
  item.commoditygroup, 
  item.itemnum, 
  item.description, 
  item.commodity, 
  inv5000.location, 
  inv5000.siteid, 
  ...
from (select top 5000 itemnum, location, siteid, from inventory) inv5000
inner join item on item.itemnum = inv5000.itemnum;

也许这会改变一些东西。也许不吧。祝你好运!

于 2014-04-04T10:05:46.250 回答
0

对于您的 unitcost 子选择,请改用 matretransid 和 matusetransid。这些 ID 字段已编入索引,将使您的查询更快:

(Select m1.unitcost from matrectrans m1 where m1.matrectransid =
(select max(m2.matrectransid) from matrectrans m2 
where item.itemnum = m2.itemnum and m2.issuetype='RECEIPT' and linecost <> 0))
ReceivedUnitCost

(Select m3.unitcost from matusetrans m3 where m3.matusetransid = 
(select max(m4.matusetransid) from matusetrans m4 
where item.itemnum = m4.itemnum and m4.issuetype='ISSUE' and linecost <> 0)) 
IssuedUnitCost

在我的数据库中,更大的 ID 值与更新的日期相关。您可以使用Lag Function验证自己:

这适用于 Oracle,但 SQL Server 也具有 LAG 功能。

select matusetransid, 
to_char(transdate, 'DD-MON-YYYY HH24:MI:SS.ss') transdate,  
LAG (to_char(transdate, 'DD-MON-YYYY HH24:MI:SS.ss'),1) 
over (order by transdate desc) as prev_transdate, 
(case when transdate > LAG (transdate,1) over (ORDER BY matusetransid desc) 
then 1 else 0 end) as test 
from matusetrans
where 4 = 1
order by matusetransid desc;

如果上述查询返回任何行,这意味着某些数据不按顺序排列(插值)。

只是对结果集的附注:您正在选择inventory.location 和inventory.siteid,但您的子选择在这些字段上不匹配。如果您的 itemnum 仅属于一个 siteid 和位置(储藏室),则当前查询应该没问题。否则,您的结果可能不准确。

于 2014-04-04T18:13:06.770 回答