[odb-users] Using prefetch with Oracle

Boris Kolpackov boris at codesynthesis.com
Mon Feb 13 08:56:52 EST 2017


Hi Marco,

Marco Craveiro <marco.craveiro at gmail.com> writes:

> I'm going to have a look and see if I can follow the same pattern for
> the bulk parameter so that it uses the pragma value when setting the
> prefetch (and does nothing if bulk is not set). If I do this, would
> you accept it as a patch?

Hm, I am not sure the bulk approach (with a compiler-time pragma) is
right in this case. There we don't really have a choice since we need
to know the "batch buffer" size.

But here it is all runtime. Plus, you may want to have different
prefetch for different queries of the same object. In fact, you
can already customize it for queries (but not for object loads)
by using prepared queries (Section 4.5 in the manual):

1. Create prepared query.

2. Get its statement (statement()).

3. Cast it to odb::oracle::select_statement.

4. Call handle() on the result to get OCIStmt*.

5. Set custom OCI_ATTR_PREFETCH_ROWS.

6. Execute the query.

The problems with this approach are: (1) it is tedious and (2) it
doesn't work for non-query SELECT's (e.g., database::load()). So
perhaps the way to do it is:

1. Provide prefetch() functions on oracle::database() and
   oracle::connection() that can be used to modify database-wide
   and connection-wide prefetch values. Also set it to some
   reasonable default (say 512?)

2. Provide oracle::select_statement::prefetch() to make the
   prepared query approach less tedious.

What do you think?

Boris



More information about the odb-users mailing list