[ 
https://issues.apache.org/jira/browse/CALCITE-604?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Hyde resolved CALCITE-604.
---------------------------------
       Resolution: Fixed
    Fix Version/s: 1.7.0

Fixed in http://git-wip-us.apache.org/repos/asf/calcite/commit/d14040c5.

> Invoke metadata providers via a class generated at runtime, rather than 
> reflection
> ----------------------------------------------------------------------------------
>
>                 Key: CALCITE-604
>                 URL: https://issues.apache.org/jira/browse/CALCITE-604
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Assignee: Julian Hyde
>             Fix For: 1.7.0
>
>
> Currently we dispatch to metadata providers using reflection. With this 
> change, we generate a dispatcher class and compile using Janino.
> Currently calls to metadata providers are dispatched via reflection 
> (Method.invoke, see ReflectiveRelMetadataProvider, ChainedRelMetadataProvider 
> and CachingInvocationHandler), and I suspect that planning a complex query 
> (especially with tracing enabled) makes millions of calls. Reflection has a 
> performance problem; lots of boxing and unboxing and creating temporary 
> arrays and bound objects.
> One option we considered to improve performance was moving to MethodHandle. 
> (JDK 1.7 introduced 
> http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandle.html, 
> a more efficient way to invoke methods. Access control etc. is done when the 
> handle is created, not each invocation.) However, MethodHandle.invoke can 
> dispatch only within one provider.
> So, we should generate a dispatcher class, and compile and instantiate at run 
> time using Janino.
> For each metadata interface we will need to add a handler interface that has 
> the same methods but two extra arguments (a sub-class of RelNode, and a 
> RelMetadataQuery). Previously these arguments were passed by calling "bind" 
> on an UnboundMetadata.
> We can also make the dispatcher cache the results within a metadata call. 
> This should yield a performance improvement when, say, a join requires many 
> kinds of metadata (rowCount, averageRowSize, selectivity) and they all rely 
> on the rowCount of the input, and that rowCount is expensive to compute.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to