Итак, я работаю над проектом по интеллектуальному анализу данных, где мы смотрим на элементы кода, их взаимосвязи и изменения в этих вещах с течением времени.Мы хотим задать несколько вопросов о том, как часто меняются связанные элементы.Я настроил это как представление, но это занимает около 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) и авторские окна, типы авторов которых мы хотим (одинаковые, разные и не нужные).все равно).Частично проблема заключается в том, что у нас может быть одна и та же пара ревизий с сопоставлением разных элементов, поэтому единственное, что я могу придумать, - это некрасивый счетчик (отличный от concat ()).Это должно вернуть таблицу с 12 строками, по одной для каждой комбинации окон автора и ревизии.Записи под 'num' являются уникальными парами ревизий, связанных указанным способом (в этом случае оба метода изменения и один из методов вызывают другой).Работает отлично, просто безумно медленно (~ 10 минут работы).Я в основном ищу любой совет или помощь, чтобы сделать эту работу лучше, не жертвуя точностью.