[
https://issues.apache.org/jira/browse/DERBY-4346?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12741794#action_12741794
]
Knut Anders Hatlen commented on DERBY-4346:
-------------------------------------------
Here's a simpler query to illustrate the problem. I made
greaterEqualStringFromParameterWithEsc() and
lessThanStringFromParameterWithEsc() print a line each time they're called and
executed a query which performed a nested join with a LIKE clause restricting
the inner table. It looks like greaterEqualString and lessThanString are
recomputed once for every row in the outer table. I'd guess this is because the
inner result set is reopened for each row in the outer table.
ij> create table t (x varchar(10) unique not null);
0 rows inserted/updated/deleted
ij> insert into t values 'abc','def','ghi';
3 rows inserted/updated/deleted
ij> prepare ps as 'select * from --derby-properties joinOrder=FIXED
t t1, t t2 where t2.x like ? escape ''x''';
ij> execute ps using 'values ''___''';
IJ WARNING: Autocommit may close using result set
greaterEqualStringFromParameterWithEsc(___, x, 10)
lessThanStringFromParameterWithEsc(___, x, 10)
X |X
---------------------
abc |abc
abc |def
abc |ghi
greaterEqualStringFromParameterWithEsc(___, x, 10)
lessThanStringFromParameterWithEsc(___, x, 10)
def |abc
def |def
def |ghi
greaterEqualStringFromParameterWithEsc(___, x, 10)
lessThanStringFromParameterWithEsc(___, x, 10)
ghi |abc
ghi |def
ghi |ghi
9 rows selected
ij>
> LIKE with parameter recomputes greaterEqualString and lessThanString way too
> often
> ----------------------------------------------------------------------------------
>
> Key: DERBY-4346
> URL: https://issues.apache.org/jira/browse/DERBY-4346
> Project: Derby
> Issue Type: Improvement
> Components: SQL
> Affects Versions: 10.5.1.1
> Reporter: Knut Anders Hatlen
>
> I profiled a 7-way join (the exact query can be found here:
> http://src.opensolaris.org/source/xref/opengrok/trunk/src/org/opensolaris/opengrok/history/JDBCHistoryCache_queries.properties?r=809%3Abdef8b63f333#82
> ) and saw that 40% of the time was spent in
> Like.greaterEqualStringFromParameterWithEsc() and
> Like.lessThanStringFromParameterWithEsc().
> These methods are used to generate "x >= greaterEqualString" and "x <
> lessThanString" clauses that enable a "LIKE ?" clause to make use of indexes.
> Since the value of the ? parameter is constant throughout a single execution
> of the statement, it should only be necessary to invoke these methods once
> per LIKE clause per execution. They are clearly called more frequently for
> the query in question, and reducing the number of invocations to one per
> execution would probably make the query execute almost twice as fast.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.