Hi. This is because H2 uses only one index per logical table. Take a look on 
using multiples indexes here: 
http://www.h2database.com/html/performance.html#explain_plan

Att,

Fred

Enviado via iPad

Em 26/04/2012, às 09:30, Steve McLeod <steve.mcl...@gmail.com> escreveu:

> Hi Thomas,
> 
> It is useful to put EXPLAIN ANALYZE before your query to see what's going on. 
> It will show you which index is picked, and whether a table scan is necessary:
> 
> explain analyze SELECT * FROM TRIPPLETCOUNT 
>   WHERE RELATION = 'REQUESTED' 
>   AND ( LEFT = 'sb_1909322' OR RIGHT= 'sb_1909322') 
>   ORDER BY COUNT DESC;
> PLAN  
> SELECT
>     TRIPPLETCOUNT.LEFT,
>     TRIPPLETCOUNT.RIGHT,
>     TRIPPLETCOUNT.RELATION,
>     TRIPPLETCOUNT.COUNT
> FROM PUBLIC.TRIPPLETCOUNT
>     /* PUBLIC.TRIPPLETCOUNT.tableScan */
>     /* scanCount: 1 */
> WHERE (RELATION = 'REQUESTED')
>     AND ((LEFT = 'sb_1909322')
>     OR (RIGHT = 'sb_1909322'))
> ORDER BY 4 DESC
> (1 row, 0 ms)
> 
> 
> explain analyze SELECT * FROM TRIPPLETCOUNT 
>   WHERE RELATION = 'REQUESTED' 
>   AND LEFT = 'sb_1909322' 
> UNION 
> SELECT * FROM TRIPPLETCOUNT 
>   WHERE RELATION = 'REQUESTED' 
>   AND RIGHT = 'sb_1909322' 
> ORDER BY COUNT DESC;
> PLAN  
> (SELECT DISTINCT
>     TRIPPLETCOUNT.LEFT,
>     TRIPPLETCOUNT.RIGHT,
>     TRIPPLETCOUNT.RELATION,
>     TRIPPLETCOUNT.COUNT
> FROM PUBLIC.TRIPPLETCOUNT
>     /* PUBLIC.INDEX_LEFT: LEFT = 'sb_1909322' */
>     /* scanCount: 1 */
> WHERE (RELATION = 'REQUESTED')
>     AND (LEFT = 'sb_1909322'))
> UNION
> (SELECT DISTINCT
>     TRIPPLETCOUNT.LEFT,
>     TRIPPLETCOUNT.RIGHT,
>     TRIPPLETCOUNT.RELATION,
>     TRIPPLETCOUNT.COUNT
> FROM PUBLIC.TRIPPLETCOUNT
>     /* PUBLIC.INDEX_RIGHT: RIGHT = 'sb_1909322' */
>     /* scanCount: 1 */
> WHERE (RELATION = 'REQUESTED')
>     AND (RIGHT = 'sb_1909322'))
> ORDER BY 4 DESC
> 
> 
> On Thursday, 26 April 2012 12:29:44 UTC+2, Thomas Egense wrote:
> I tested that the query time with the OR-query matches a full table 
> scan and this is the simplest explanation also. 
> 
> On Apr 26, 11:45 am, Steve McLeod <steve.mcl...@gmail.com> wrote: 
> > My understanding is that H2 chooses at most one index to use per SELECT 
> > statement. With your OR example, this will therefore require a complete 
> > table scan to satisfy one side of the OR statement. 
> > 
> > I wonder how other database engines deal with this. Do they use multiple 
> > indexes per SELECT? Or do they rewrite the SQL statement to become a UNION 
> > statement? 
> > 
> > 
> > 
> > 
> > 
> > 
> > 
> > On Wednesday, 25 April 2012 09:33:41 UTC+2, Thomas Egense wrote: 
> > 
> > > I am using the latest version of H2: 1.3.166 
> > > Maybe this issue is known, but for most other DB-products it is 
> > > counterintuitive. 
> > 
> > > The table has about 6M rows. Table has 4 
> > > Columns(left,right,relation,count) and each have their own index. 
> > > SQL1 and SQL2 below are result-set identical except the order is 
> > > slightly different for same value of COUNT. 
> > > And normally for performance you would use SQL1. 
> > 
> > > SQL1: Takes 1 second+. Sometimes several seconds. 
> > > SQL2: Takes around 2 milis. 
> > 
> > > SQL1: 
> > > SELECT * FROM TRIPPLETCOUNT 
> > >   WHERE RELATION = 'REQUESTED' 
> > >   AND ( LEFT = 'sb_1909322' OR RIGHT= 'sb_1909322') 
> > >   ORDER BY COUNT DESC 
> > 
> > > SQL2: 
> > > SELECT * FROM TRIPPLETCOUNT 
> > >   WHERE RELATION = 'REQUESTED' 
> > >   AND LEFT = 'sb_1909322' 
> > > UNION 
> > > SELECT * FROM TRIPPLETCOUNT 
> > >   WHERE RELATION = 'REQUESTED' 
> > >   AND RIGHT = 'sb_1909322' 
> > > ORDER BY COUNT DESC
> -- 
> You received this message because you are subscribed to the Google Groups "H2 
> Database" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/h2-database/-/yl-Th51GZAsJ.
> To post to this group, send email to h2-database@googlegroups.com.
> To unsubscribe from this group, send email to 
> h2-database+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/h2-database?hl=en.

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To post to this group, send email to h2-database@googlegroups.com.
To unsubscribe from this group, send email to 
h2-database+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en.

Reply via email to