【发布时间】:2011-03-15 10:34:37
【问题描述】:
所以我正在从事一个数据挖掘项目,我们正在研究代码元素及其关系以及随着时间的推移对这些事物的变化。我们想要问一些关于相关元素多久更改一次的问题。我已将其设置为视图,但运行大约需要 10 分钟。我相信问题是我必须做很多减法、连接和字符串比较来比较条目(对于我们的窗口大小),但我不知道解决这个问题的好方法。查询看起来像
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 存储了我们想要的作者类型(相同、不同和不关心)。部分问题是,我们可以有相同的修订对与不同的元素匹配,所以我能想出的唯一技巧就是那个丑陋的 count(distinct concat()) 东西。这应该返回一个有 12 行的表,每个组合一个作者和修订窗口。 “num”下的条目是以指定方式相关的唯一修订对(在这种情况下,更改方法和其中一个方法调用另一个)。它运行良好,只是非常慢(运行时间约 10 分钟)。我基本上是在寻找任何建议或帮助,以在不牺牲准确性的情况下更好地完成这项工作。
【问题讨论】:
-
你有所有主键/外键的索引吗?每个表有多少行?
-
methodinvocation中有多少条记录? -
所有键都被索引。方法调用表中有大约 110K 条目。 deltamethoddeclaration 有 120K 条目,revision 有 14K
-
@Kyle P - 您有什么理由使用 Case 表达式而不是
aw.same = 1 And r1.author = r2.author? -
因为我也想要 aw.same 不是 1 的结果,而且这些结果不应该问作者是否相同。我一定是误解了你的问题。
标签: mysql sql query-optimization