Thread: When limit is greater than 813,500 activity seems to slow way down or stop

When limit is greater than 813,500 activity seems to slow way down or stop

From
"Wm.A.Stafford"
Date:
I'm writing a Java client to load Google Base with records from our
PostgreSQL 8.3 db.  The table I'm querying has about 15 million records
and I was hoping to just loop over this table creating one Google entry
for each db row.  However, using the code below, if the limit is greater
than around 813,500 the application just sits there apparently doing
nothing.  For lower values it starts immediately and runs to
completion.  I'm guessing that this might be some sort of memory problem
but I thought using a cursor-based, read-only result set would prevent
memory issues.

Any ideas why 813,500+ seems to be a magic number?

Thanks for any help or advice,
-=beeky


public static final String dataQuery = "select
A.cache_id,A.validname,A.validnameauthor, A.daycollected,
A.monthcollected, A.yearcollected, A.latitude, A.longitude, A.depth,
B.resource_full_name,
'http://marinespecies.org/aphia.php?p=taxdetails&id=' || C.worms_id as
worms_url,  'http://data.iobis.org/distRec.do?id='|| A.cache_id as
dist_rec_url from obis.cache A, obis.obis_resources B, obis.taxa C where
A.resource_id=B.resource_id and A.taxon_id=C.taxon_id offset 0 limit
800000" ;

conn.setAutoCommit(false);
stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY) ;
stmt.setFetchSize(600);
rs = stmt.executeQuery(dataQuery) ;

while (rs.next()) {
    ... process next row


Re: When limit is greater than 813,500 activity seems to slow way down or stop

From
"Albe Laurenz"
Date:
Wm.A.Stafford wrote:
> I'm writing a Java client to load Google Base with records from our
> PostgreSQL 8.3 db.  The table I'm querying has about 15 million records
> and I was hoping to just loop over this table creating one Google entry
> for each db row.  However, using the code below, if the limit is greater
> than around 813,500 the application just sits there apparently doing
> nothing.  For lower values it starts immediately and runs to
> completion.  I'm guessing that this might be some sort of memory problem
> but I thought using a cursor-based, read-only result set would prevent
> memory issues.
>
> Any ideas why 813,500+ seems to be a magic number?

[...]

> public static final String dataQuery = "select
> A.cache_id,A.validname,A.validnameauthor, A.daycollected,
> A.monthcollected, A.yearcollected, A.latitude, A.longitude, A.depth,
> B.resource_full_name,
> 'http://marinespecies.org/aphia.php?p=taxdetails&id=' ||
> C.worms_id as
> worms_url,  'http://data.iobis.org/distRec.do?id='|| A.cache_id as
> dist_rec_url from obis.cache A, obis.obis_resources B, obis.taxa C where
> A.resource_id=B.resource_id and A.taxon_id=C.taxon_id offset 0 limit
> 800000" ;

The first thing I would try is to run EXPLAIN on the query as you
vary the LIMIT. Does the execution plan change at 813500?

If that does not yield any results, I would try to run both queries
from the psql command line to see if the behaviour is similar.
That way you can determine if the problem has to do with the database
server or with the JDBC driver.

Yours,
Laurenz Albe