> Does anyone know why this method might be so expensive?

Because it's main method to execute your queries.
I believe I can safely assume that org.sqlite.NativeDB.step maps
directly to C call sqlite3_step() and it's the only function where
query is executed. It doesn't just iterate through resultset it
obtains this resultset it too.

Pavel

On Thu, Sep 24, 2009 at 11:24 PM, George Bills <gbi...@funnelback.com> wrote:
> Hi everyone - this might be a general JDBC question rather than an
> SQLite specific question, but I'm not sure.
>
> I've got an app that's writing to an SQLite database using the latest
> SQLite JDBC driver ("v056, based on SQLite 3.6.14.2") from
> http://www.zentus.com/sqlitejdbc/.
>
> I've done some basic profiling using hprof, and initially things are
> fine. But then my tables get quite large (e.g. 26 million / 7 million /
> 6 million rows), and after this point, I find that a huge amount of my
> apps time is being spent in "org.sqlite.NativeDB.step".
>
> Does anyone know why this method might be so expensive? I probably need
> to dig deeper with my profiling and find out exactly which methods are
> calling the expensive "step"s, but I'm fairly new to working with JDBC
> and any hints or suggestions would be helpful.
>
> During the applications run, I'll be running a certain amount of selects
> and inserts, but in all cases, I'll be selecting or inserting 1 row at a
> time, so I wouldn't expect that iterating over my ResultSet (I assume
> this is what org.sqlite.NativeDB.step is doing) would be very expensive.
>
> The code that does the selection of a row, given an SQL string and an
> array of string parameters is like:
>
>             selectStatement = databaseConnection.prepareStatement(SQL);
>             setStatementParameters(selectStatement, parameters);
>             resultSet = selectStatement.executeQuery();
>             singleResult = parseResultForSingleElement(resultSet,
> columnName);
>
> The code that does the insertion of a row, given an SQL string and an
> array of string parameters is like:
>
>             insertStatement = databaseConnection.prepareStatement(SQL);
>             setStatementParameters(insertStatement, parameters);
>             insertStatement.executeUpdate();
>             resultSet = insertStatement.getGeneratedKeys();
>             autoincrementPK = parseResultForSingleElement(resultSet, null);
>
> parseResultForSingleElement is like:
>
>         if (numColumns == 1 && res.next()) {
>             E val;
>             if (columnName != null) {
>                 val = (E) res.getObject(columnName);
>             } else {
>                 val = (E) res.getObject(1);
>             }
>             if (res.wasNull()) {
>                 ret = new SQLVal<E>(ResultStatus.RESULT_WAS_NULL);
>             } else {
>                 ret = new SQLVal<E>(val);
>             }
>         }
>
> Thanks for any help.
> George.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to