Databases are tuned
to do statement caches. They usually include some kind of statement cache. This
cache uses the statement itself as a key and the access plan is stored in the
cache with the corresponding statement. This allows the database engine to
reuse the plans for statements that have been executed previously. For example,
if we sent the database a statement such as "select a,b from t where c =
2", then the computed access plan is cached. If we send the same statement
later, the database can reuse the previous access plan, thus saving us CPU
power.
Note however, that
the entire statement is the key. For example, if we later sent the statement
"select a,b from t where c = 3", it would not find an access plan.
This is because the "c=3" is different from the cached plan
"c=2". So, for example:
For(int
I = 0; I < 1000; ++I)
{
PreparedStatement ps = conn.prepareStatement("select a,b from t where c = " + I);
ResultSet rs = Ps.executeQuery();
Rs.close();
Ps.close();
}
{
PreparedStatement ps = conn.prepareStatement("select a,b from t where c = " + I);
ResultSet rs = Ps.executeQuery();
Rs.close();
Ps.close();
}
Here the cache won't
be used. Each iteration of the loop sends a different SQL statement to the
database. A new access plan is computed for each iteration and we're basically
throwing CPU cycles away using this approach. However, look at the next
snippet:
PreparedStatement
ps = conn.prepareStatement("select a,b from t where c = ?");
For(int I = 0; I < 1000; ++I)
{
ps.setInt(1, I);
ResultSet rs = ps.executeQuery();
Rs.close();
}
ps.close();
For(int I = 0; I < 1000; ++I)
{
ps.setInt(1, I);
ResultSet rs = ps.executeQuery();
Rs.close();
}
ps.close();
Here it will be much
more efficient. The statement sent to the database is parameterized using the
'?' marker in the sql. This means every iteration is sending the same statement
to the database with different parameters for the "c=?" part. This
allows the database to reuse the access plans for the statement and makes the
program execute more efficiently inside the database. This basically let's your
application run faster or makes more CPU available to users of the database.
No comments:
Post a Comment