2014-04-04 46 views
0

我已經爲SRSS報告編寫了一個查詢,該報告應該從maximo中檢索項目列表。SQL查詢從多行中獲取最新信息 - 太慢

它包括有多少商品存在,如果他們有收到和/或發佈日期(如果是的話最新日期)以及當時的單位成本。

雖然它返回我想要的,但運行速度非常緩慢,直到它在報告中使用時似乎永遠不會加載。 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 

感謝

+0

如果您發佈所涉及的表的結構,這就幫,他們是如何聯繫在一起,以及您想要查詢的內容。 –

+0

請你也可以添加執行計劃的圖像。我懷疑這是因爲你沒有足夠的索引設置 – sarin

回答

1

有很多的工作,爲每個項目的所有的子查詢的數據庫管理系統做的。所以不要指望這很快。我想你已經確定這些表具有適當的索引。

因此,我認爲加速這項工作的唯一機會是讓dbms儘可能快地找到這5000條記錄。事實上,您不使用訂單,因此您只需獲得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; 

也許這改變了一些東西。也許不會。祝你好運!

0

對於您的unitcost子選擇,請改爲使用matrectransid和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值相關於一個更近的transdate。您可以使用以下驗證自己: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和位置(倉庫),則當前查詢應該沒問題。否則,你的結果可能不準確。

+0

非常感謝你的回覆..我通過它並有一個答案 – user3494666

0

謝謝大家 - 我結束了與此查詢其作品更快(它得到10000條記錄在2秒)

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')) 
+0

你放棄了引入單位成本? – Sun