I was surprised at how long a simple query with a join was taking and so 
tested my application with postgres.  For H2, I implemented a 
jdbcConnectionPool and for postgres, I used the Tomcat jdbc-pool.  The 
following shows the performance for executing the same query several times 
in each Db.  I am using postgres 9.1 and H2 1.3.167.

Below are some relevant statistics.  Any thoughts on how I can improve the 
H2 numbers?  From the H2 performance page I expected 10x the postgres 
performance.

By the way, the H2 Db is fully compacted and is used in strictly read-only 
mode, so no fragmentation.

====== PGSQL ====== 
 INFO [main] (SystemScanner.java:102) - Starting system scanner.
 INFO [main] (DbConnectionFactory.java:76) - Using datasource URL: 
jdbc:postgresql://localhost:5432/db.
 INFO [main] (SystemScanner.java:118) - ...entering monitoring mode.
 INFO [SocketListener] (SocketListener.java:73) - Starting socket listener.
 INFO [SocketListener] (SocketListener.java:79) - ...listening on 
localhost:8180

 INFO [SocketListener] (ServerSocketHandler.java:28) - Opening socket 
handler for incoming connection: /127.0.0.1:52237
DEBUG [ServerSocketHandler] (FileRecordDAO.java:38) - Executing 
com.comdev.da.dao.FileRecordDAO getMatchingFileRecords( "AST_" ) produced 
569 results and took 2236 ms.
 INFO [ServerSocketHandler] (ClientSocket.java:86) - Closing socket from 
/127.0.0.1:52237
 INFO [SocketListener] (ServerSocketHandler.java:28) - Opening socket 
handler for incoming connection: /127.0.0.1:52238
DEBUG [ServerSocketHandler] (FileRecordDAO.java:38) - Executing 
com.comdev.da.dao.FileRecordDAO getMatchingFileRecords( "AST_" ) produced 
569 results and took 600 ms.
 INFO [ServerSocketHandler] (ClientSocket.java:86) - Closing socket from 
/127.0.0.1:52238
 INFO [SocketListener] (ServerSocketHandler.java:28) - Opening socket 
handler for incoming connection: /127.0.0.1:52239
DEBUG [ServerSocketHandler] (FileRecordDAO.java:38) - Executing 
com.comdev.da.dao.FileRecordDAO getMatchingFileRecords( "AST_" ) produced 
569 results and took 544 ms.
 INFO [ServerSocketHandler] (ClientSocket.java:86) - Closing socket from 
/127.0.0.1:52239
 INFO [Thread-3] (SystemScanner.java:194) - SocketListener shutdown.
 INFO [Thread-3] (SocketListener.java:148) - Shutting down socket listener.
 INFO [Thread-3] (SocketListener.java:158) - ...closed.  No longer 
accepting connections.
 INFO [Thread-3] (DbConnectionFactory.java:185) - Executing pre-shutdown 
command for PGSQL database.

====== H2 ====== 
 INFO [main] (SystemScanner.java:102) - Starting system scanner.
 INFO [main] (DbConnectionFactory.java:76) - Using datasource URL: 
jdbc:h2:C:\Users\xxx\workspace\SystemScanner/db.
DEBUG [main] (H2DataSourceFactory.java:72) - Debug state initialized.
 INFO [main] (SystemScanner.java:118) - ...entering monitoring mode.
 INFO [SocketListener] (SocketListener.java:73) - Starting socket listener.
 INFO [SocketListener] (SocketListener.java:79) - ...listening on 
localhost:8180

 INFO [SocketListener] (ServerSocketHandler.java:28) - Opening socket 
handler for incoming connection: /127.0.0.1:52240
DEBUG [ServerSocketHandler] (FileRecordDAO.java:38) - Executing 
com.comdev.da.dao.FileRecordDAO getMatchingFileRecords( "AST_" ) produced 
81 results and took 46955 ms.
 INFO [ServerSocketHandler] (ClientSocket.java:86) - Closing socket from 
/127.0.0.1:52240
 INFO [SocketListener] (ServerSocketHandler.java:28) - Opening socket 
handler for incoming connection: /127.0.0.1:52241
DEBUG [ServerSocketHandler] (FileRecordDAO.java:38) - Executing 
com.comdev.da.dao.FileRecordDAO getMatchingFileRecords( "AST_" ) produced 
81 results and took 4061 ms.
 INFO [ServerSocketHandler] (ClientSocket.java:86) - Closing socket from 
/127.0.0.1:52241
 INFO [SocketListener] (ServerSocketHandler.java:28) - Opening socket 
handler for incoming connection: /127.0.0.1:52242
DEBUG [ServerSocketHandler] (FileRecordDAO.java:38) - Executing 
com.comdev.da.dao.FileRecordDAO getMatchingFileRecords( "AST_" ) produced 
81 results and took 4247 ms.
 INFO [ServerSocketHandler] (ClientSocket.java:86) - Closing socket from 
/127.0.0.1:52242

I haven't yet tested H2 in client-server mode.

The resource_ref table has a foreign key to the lookup table -- the lookup 
table is a many-to-one back to the resource_ref table.  The H2 query 
returns 38601 records, the postgres query returns 63380.  The postgres db 
has 3 288 821 lookup records, while H2 only has 1 525 717.

Here are the plans:

H2:
SELECT DISTINCT
    UID,
    PATH,
    FILENAME,
    LASTTOUCHED,
    CREATEDTIME,
    UPDATEDTIME
FROM (
    SELECT
        RESOURCEID
    FROM DB.LOOKUP
        /* DB.IDX_LOOKUPKEY: LOOKUPKEY >= 'AST'
            AND LOOKUPKEY < 'ASU'
         */
    WHERE LOOKUPKEY LIKE 'AST%'
) LOOKUP
    /* SELECT
        RESOURCEID
    FROM DB.LOOKUP
        /++ DB.IDX_LOOKUPKEY: LOOKUPKEY >= 'AST'
            AND LOOKUPKEY < 'ASU'
         ++/
    WHERE LOOKUPKEY LIKE 'AST%'
     */
    /* scanCount: 38602 */
INNER JOIN DB.RESOURCE_REF RESOURCE
    /* DB.PRIMARY_KEY_7: UID = LOOKUP.RESOURCEID */
    ON 1=1
    /* scanCount: 77202 */
WHERE RESOURCE.UID = LOOKUP.RESOURCEID
ORDER BY 3
/*
total: 14372
LOOKUP.IDX_LOOKUPKEY read: 293 (2%)
LOOKUP.LOOKUP_DATA read: 5135 (35%)
PAGE_INDEX.PAGE_INDEX_DATA read: 2 (0%)
RESOURCE_REF.RESOURCE_REF_DATA read: 2584 (17%)
TEMP_RESULT_SET_34.TEMP_RESULT_SET_34 read: 3286 (22%)
TEMP_RESULT_SET_34.TEMP_RESULT_SET_34_DATA read: 3072 (21%)
*/

PGSQL:
 Unique  (cost=102449.56..103639.47 rows=67995 width=58) (actual 
time=1269.422..1379.455 rows=63380 loops=1)
   ->  Sort  (cost=102449.56..102619.54 rows=67995 width=58) (actual 
time=1269.421..1364.431 rows=63814 loops=1)
         Sort Key: resource.filename, resource.uid, resource.path, 
resource.lasttouched, resource.createdtime, resource.updatedtime
         Sort Method: external merge  Disk: 4208kB
         ->  Merge Join  (cost=69973.26..94433.39 rows=67995 width=58) 
(actual time=593.265..835.823 rows=63814 loops=1)
               Merge Cond: (resource.uid = db.lookup.resourceid)
               ->  Index Scan using resource_ref_pkey on resource_ref 
resource  (cost=0.00..21907.08 rows=605796 width=58) (actual 
time=0.007..154.629 rows=606402 loops=1)
               ->  Materialize  (cost=69973.23..70313.20 rows=67995 
width=8) (actual time=593.244..610.836 rows=63814 loops=1)
                     ->  Sort  (cost=69973.23..70143.22 rows=67995 width=8) 
(actual time=593.241..603.593 rows=63814 loops=1)
                           Sort Key: db.lookup.resourceid
                           Sort Method: external sort  Disk: 1128kB
                           ->  Seq Scan on lookup  (cost=0.00..63584.56 
rows=67995 width=8) (actual time=0.044..543.486 rows=63814 loops=1)
                                 Filter: ((lookupkey)::text ~~ 'AST%'::text)
 Total runtime: 1382.849 ms

-- 
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/-/6vqsuqzelZAJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en.

Reply via email to