Prepared Statements: Inefficient Type Conversion?
От | James House |
---|---|
Тема | Prepared Statements: Inefficient Type Conversion? |
Дата | |
Msg-id | 46238730.6060903@part.net обсуждение исходный текст |
Ответы |
Re: Prepared Statements: Inefficient Type Conversion?
|
Список | 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.
Вложения
В списке pgsql-jdbc по дате отправления: