Prepared Statements: Inefficient Type Conversion?

From: James House <jhouse(at)part(dot)net>
To: pgsql-jdbc(at)postgresql(dot)org
Subject: Prepared Statements: Inefficient Type Conversion?
Date: 2007-04-16 14:24:48
Message-ID: 46238730.6060903@part.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc


I have a table "upids" that has approx 40 million rows. One column is
named "upid" and is of type NUMERIC.

Both of the following queries (ran as a statement) execute in equivalent
time, 32 milliseconds:

select vdi_id, leaf_category_id, vdi_key1, vdi_key2, vdi_key3 from
upids where upid = 12239984;

select vdi_id, leaf_category_id, vdi_key1, vdi_key2, vdi_key3 from
upids where upid = '12239984';

(the subtle difference is that the value being passed is a number in one
case, a string in the other case).

Now, if I execute the following PreparedStatement, the query time is a
minute and a half:

pstmt = conn.prepareStatement(query);
pstmt.setString(1, upid);
rs = pstmt.executeQuery();

But with this prepared statement execution it is once again approx 30
milliseconds:

pstmt = conn.prepareStatement(query);
pstmt.setLong(1, Long.parseLong(upid));
rs = pstmt.executeQuery();

It seems that using the prepared statement to pass the value as a string
causes all of the 40 million upid values in the table to convert to
string, rather than the string parameter being converted to a number.
Can't the driver be smarter than that?

My problem is that my application code thinks of upid as a string, but
the database has been designed for it to be an integer - which in this
particular instance of the application the database is coincidentally
correct in that all values of upid can be represented as a number, but
my application code also has to work in other instances where it is
truly a string - hence my prepared statement needs to use setString().
Also, this works fine on Oracle (no performance penalty), for which the
application was originally made.

Thanks for any pointers that may help me around this.

Attachment Content-Type Size
jhouse.vcf text/x-vcard 259 bytes

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message vasylenko 2007-04-16 14:35:19 How to modify my class inherited from java.sql.Array
Previous Message villeja 2007-04-16 14:15:41 Bug in timezone-parsing?