Thanks for this! It seems to a very thorough analysis of the problem.
Can you create a ticket for this and at least link to this thread in the
mailing list archive?

/Nicklas


Pawel Sztromwasser wrote:
> Nicklas Nordborg wrote:
>>> Hi Nicklas,
>>>
>>> I agree that the query is rather complex and has to take some time to
>>> execute, but over 200ms? Besides, the effect that it is causing
>>> (extremely long experiment overview loading) is really annoying.
>>> I had a look at db server logs and found the query:
>>>
>>>
>>> select distinct annotation0_."id" as id1_0_0_,
>>>             annotation6_."id" as id1_6_1_,
>>>             annotation0_."version" as version2_0_0_,
>>>
>>>             ... fields from annotation0_ and annotation6_ tables...
>>>
>>>             annotation6_."projectkey_id" as projectkey19_6_1_,
>>>             annotation6_."owner" as owner20_6_1_
>>> from "Annotations" annotation0_
>>>     left outer join "InheritedAnnotations" inheriting1_ on
>>> annotation0_."id"=inheriting1_."annotation_id"
>>>     left outer join "AnnotationSets" annotation2_ on
>>> inheriting1_."annotationset_id"=annotation2_."id"
>>>     left outer join "AnnotationSets" annotation3_ on
>>> annotation0_."annotationset_id"=annotation3_."id"
>>>     left outer join "InheritedAnnotationSets" inheriting4_ on
>>> annotation3_."id"=inheriting4_."inherited_id"
>>>     left outer join "AnnotationSets" annotation5_ on
>>> inheriting4_."annotationset_id"=annotation5_."id"
>>>     inner join "AnnotationTypes" annotation6_ on
>>> annotation0_."annotationtype_id"=annotation6_."id"
>>> where annotation2_."id"=$1 or annotation5_."id"=$1 order by
>>> annotation6_."name" ASC
>>>
>>>
>>> It contains 3 joins with no reason (adding AnnotationSets table 3 times,
>>> never using fields exclusively belonging to it). When I removed the 3
>>> joins (and fixed dependencies) the FROM-WHERE part looks like:
>>>
>>>
>>> from "Annotations" annotation0_
>>>     left outer join "InheritedAnnotations" inheriting1_ on
>>> annotation0_."id"=inheriting1_."annotation_id"
>>>     left outer join "InheritedAnnotationSets" inheriting4_ on
>>> annotation0_."annotationset_id"=inheriting4_."inherited_id"
>>>     inner join "AnnotationTypes" annotation6_ on
>>> annotation0_."annotationtype_id"=annotation6_."id"
>>> where inheriting1_."annotationset_id"=$1 or
>>> inheriting4_."annotationset_id"=$1 order by annotation6_."name" ASC
>>>
>>>
>>> New query executes in ~5ms, so much faster. I am not sure how easy it is
>>> to apply the fix on the java-code level, but I guess it should be
>>> possible.
>>>
>>> Another way for quick and easy fix is to perform two queries and merge
>>> results: one query for directly inherited annotations (WHERE
>>> inheriting1_."annotationset_id"=$1) and the other for indirectly
>>> inherited (WHERE inheriting4_."annotationset_id"=$1).
>>> Each of these queries runs ~2.5ms and merging to lists in java shouldn't
>>> take too long either. The only problem I see could be duplicate elements
>>> on the merged list, but as long as annotation can't be inherited
>>> directly and indirectly by the same annotation set, the fix should work.
>>>
>>> Will you consider applying the fix to one of the next releases?
>> No, not in the next release. We are planning to investigate performance
>> problems for the BASE 2.11. Regarding the SQL it is something that is
>> generated by Hibernate. I don't know if it is possible to change this. Is
>> it really the main query that takes a lot of time to execute? I was more
>> thinking that the slow part is the two extra queries that are needed for
>> loading each annotation value (so if there are N annotations we need 2*N+1
>> queries to load everything).
>>
>> /Nicklas
>>
> 
> Yes, it seems to be the inherited-annotation-gathering query. It is run 
> for every rawbioassay in experiment 9 times (for all the items linked to 
> it: rba itself, scan, hyb, array batch, array slide, labeled extract,
> extract, sample and biosource). Of course if the item doesn't have any
> annotation set, the query is not executed. But still, for an experiment
> I am testing it on (ExperimentOverview object is created in
> 50-70seconds, depending on the run) the query runs 225 times (59 rbas in
> exp) which accounts for ~45seconds, so majority of the execution time.
> 
> I tried the 'quick and easy fix' from my previous mail (although
> implemented in a different way, then the first idea was; pasted below). 
> Splitting the getAllInheritedAnnotations query into several: first query 
> for directly inherited ann and the rest for indirectly inherited (one 
> per each inherited set) helps a lot. Although the number of queries 
> grows (together with complexity of the code), execution time of this 
> fragment drops to ~6ms, compared to ~200ms before. And experiment 
> overview loads much faster...
> 
> 
> // query for directly inherited annotations only
> ItemQuery<Annotation> directlyInheritedAnnotationsQuery =                     
> initQuery(as.getInheritedAnnotations(), "at", "name");
> 
> //include join with annotation types
> directlyInheritedAnnotationsQuery.join(
>       Hql.innerJoin(null, "annotationType", "at", true));
> 
> //run query and create result list (for now, only inherited directly)
> List<Annotation> inherited = new ArrayList<Annotation>(
>       directlyInheritedAnnotationsQuery.list(dc));
> 
> // get a list of all inherited sets and query each of them for
> // annotations (indirectly inherited annotations). all found ann
> // are added to inherited list
> ItemQuery<AnnotationSet> inheritedAnnotationSetsQuery =                       
>         
> as.getInheritedAnnotationSets();
> inheritedAnnotationSetsQuery.include(
> Include.MINE, Include.IN_PROJECT, Include.SHARED, Include.OTHERS);
> 
> for (AnnotationSet set : inheritedAnnotationSetsQuery.list(dc)) {
>       ItemQuery<Annotation> indirectlyInheritedAnnotationsQuery =
>               initQuery(set.getAnnotations(), "at", "name");
>       indirectlyInheritedAnnotationsQuery.join(
>               Hql.innerJoin(null, "annotationType", "at", true));             
>       inherited.addAll(indirectlyInheritedAnnotationsQuery.list(dc));
> }
> 
> I hope that the code does exactly the same thing that the original one 
> and you could make some use of it. It is not the most pretty fix, but 
> since it works and is available, maybe it could be incorporated before a 
> nice one will be introduced in 2.11? If not, spring is not that far in 
> time after all... :)
> 
> Cheers,
> Pawel
> 
> 
>>
>> ------------------------------------------------------------------------------
>> This SF.net email is sponsored by:
>> SourcForge Community
>> SourceForge wants to tell your story.
>> http://p.sf.net/sfu/sf-spreadtheword
>> _______________________________________________
>> The BASE general discussion mailing list
>> basedb-users@lists.sourceforge.net
>> unsubscribe: send a mail with subject "unsubscribe" to
>> basedb-users-requ...@lists.sourceforge.net
> 
> 
> 
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by:
> SourcForge Community
> SourceForge wants to tell your story.
> http://p.sf.net/sfu/sf-spreadtheword
> _______________________________________________
> The BASE general discussion mailing list
> basedb-users@lists.sourceforge.net
> unsubscribe: send a mail with subject "unsubscribe" to
> basedb-users-requ...@lists.sourceforge.net


------------------------------------------------------------------------------
This SF.net email is sponsored by:
SourcForge Community
SourceForge wants to tell your story.
http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________
The BASE general discussion mailing list
basedb-users@lists.sourceforge.net
unsubscribe: send a mail with subject "unsubscribe" to
basedb-users-requ...@lists.sourceforge.net

Reply via email to