因此,我正在研究一個數據挖掘項目,我們正在查看代碼元素及其關係,並隨着時間的推移對這些內容進行更改。我們想要問的是關於相關元素多久更換一次的問題。我已經將它設置爲一個視圖,但它需要運行10分鐘。我相信問題是我不得不做很多減法,串聯和字符串比較來比較條目(對於我們的窗口大小),但我不知道解決這個問題的好方法。查詢看起來像需要特定的SQL查詢優化幫助
select aw.same
, rw.k
, count(distint concat_ws(',', r1.id, r2.id)) as num
from deltamethoddeclaration dmd1
join revision r1
on r1.id=FKrevID
join methodinvocation mi
on mi.FKcallerID = dmd1.FKMDID
join deltamethoddeclaration dmd2
on mi.FKcalleeID = dmd2.FKMDID
join revision r2
on r2.id = dmd2.FKrevID
join revisionwindow rw
join authorwindow aw
where (dmd1.FKrevID - dmd2.FKrevID) < rw.k
and (dmd2.FKrevID - dmd1.FKrevID) < rw.k
and case aw.same
when 1 then
r1.author = r2.author
when 0 then
r1.author <> r2.author
else
1=1
end
group by aw.same
, rw.k
;
好了,revisionwindow存儲修訂的窗戶我們感興趣的(10,20,50,100)和authorwindow存儲了筆者類型,我們想要的(相同,不同的,也不要關心)。部分問題是,我們可能會有不同的元素匹配的修訂版本,所以我唯一能想到的就是那個醜陋的數字(獨特的concat())。這應該返回一個有12行的表,每個作者和修訂版窗口的組合都有一個表。 'num'下的條目是以指定方式相關的唯一修訂對(在這種情況下,兩個修改方法和一個方法都會調用另一個)。它完美的工作,它只是瘋狂的慢(約10分鐘的運行時間)。我基本上都在尋找任何建議或幫助在不犧牲準確性的情況下更好地完成這項工作。
您是否擁有所有主鍵/外鍵的索引?每個表中有多少行? –
'methodinvocation'中有多少條記錄? – Quassnoi
所有的鍵都被編入索引。方法表中有大約110K條目。 deltamethoddeclaration有120K條目,修訂有14K –