[ 
https://issues.apache.org/jira/browse/OPENJPA-64?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12592707#action_12592707
 ] 

Patrick Linskey commented on OPENJPA-64:
----------------------------------------

Hi Alex,

Any chance that you could post the prototype that you did?

> Optimizing empty collection fetch. Better use of jdbc-container-meta in 
> ContainerFieldMappling
> ----------------------------------------------------------------------------------------------
>
>                 Key: OPENJPA-64
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-64
>             Project: OpenJPA
>          Issue Type: Improvement
>          Components: jdbc
>            Reporter: Alex Roytman
>             Fix For: 1.1.0
>
>
> The idea of this enhancement is that, if we know that a collection field is 
> empty there is no need to fetch it. Therefore an optimization can be done if 
> we store a flag in collection owner table indicating whether it is 
> null//empty/not empty and awoid fetching null and empty collections.
> It can provide a truly dramatic performance improvement when in a large set 
> of instance only some of them have non-empty collection field. Consider a 
> very common case - composite (tree like) data structures. Unlike true 
> composite pattern typical tree structure does not have a special leaf class 
> that is any node of a tree can potentially have sub-nodes. When traversing 
> such a tree as many as 70% of fetches of child nodes will yield empty 
> collection because obviously leaf level is the larges in a tree structure :-) 
>  
> I wrote a prototype custom 1-N mapping for Kodo 3.4 which allow to store 
> "empty" flag (whether the collection is empty) on commit and will store empty 
> collection into StateManager on collection field load if the flag is set to 
> true (empty) instead of going to database to fetch it.
> The results were dramatic - when traversing 800-node tree number of 
> "fetch-sub-nodes" SQL statements was cut from 800 to 130.
> Non-Tree cases when objects have sparsely populated collection field can be 
> even more dramatic.
> If concurrency of the collection field is controlled on owned class level 
> (default) I think there is no dander of this flag being out of synch with 
> actual collection content without entering concurrent modification state.
> I have not had chance to think through transaction commit implications if any.
> There is a very nice facility in ContainerFieldMappling for indicating null 
> container fields. I wonder why it so much hard wired to empty/null and does 
> not allow non-empty/empty/null differentiation and optimization.
> The documentation states:
> " 6.2.3.7. jdbc-container-meta
> Container metadata is used to record non-essential information about 
> collection and map fields. If this extension is set to true, collections and 
> maps will be able to distinguish between the empty state and the null state. 
> If this extension is set to false or is unset, then it will not be possible 
> for Kodo to differentiate between these two states. In this situation, all 
> collections and maps in persistent objects loaded from the database will be 
> non-null"
> Actual implementation of jdbc-container-meta is very restrictive (at least in 
> 3.4 branch) and does not seem to be easily adaptable for not-fetching empty 
> collections
> It would be great if it were enhanced and no-fetch optimization for 
> null/empty collections could be performed
> Best Regards
> Alex Roytman
> Peace Technology, Inc

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to