Subject | Improving performance of BLOB read operations in JDBC |
---|---|
Author | jeeggers |
Post date | 2003-03-09T05:08:39Z |
I found the read-performance on BLOB columns to be dismal going
through JDBC, so I made some mods in the driver on my local machine.
I'd like to get some feedback from those that know the driver better.
For my test, I was reading two rows, one had a 1.6 MB Blob, the other
has a 6.1 MB blob (approx). Server is 1.5 and running on localhost
with respect to client, Win 2K. VM is 1.4.0
When I run the SELECT outside of a transaction, the
statement.executeQuery(sql) for the 2 rows takes 32 seconds the first
time, 6 seconds after that. I can't explain why it sometimes takes 5
times as long for the same query against the same data, maybe it's
what's in the server cache.
If I run the SELECT inside a transaction, executeQuery is instant,
but getBytes() on the BLOB column is slow and swings wildly:
Run # 1:
7 secs for 1.5 MB (first row) and 15 secs for 6.1 MB (second row)
Run # 2:
4 secs for 1.5 MB (first row) and 3 secs for 6.1 MB (second row)
Run # 3:
14 secs for 1.5 MB (first row), 6 seconds for 6.1 MB (second row)
Run # 4:
10 and 22 seconds
Run # 5:
8 and 6 seconds
It seems to me that the retrieval times are all over the place, why
is that ?
I cranked up the buffer sizes in FBManagedConnection and FBBlobField,
and while performance is somewhat better, it still swings widely.
I also monitored CPU utilization, and the FBServer process was using
hardly any CPU while the java process seemed to be maxed out... Any
ideas ?
Thanks,
Johannes
through JDBC, so I made some mods in the driver on my local machine.
I'd like to get some feedback from those that know the driver better.
For my test, I was reading two rows, one had a 1.6 MB Blob, the other
has a 6.1 MB blob (approx). Server is 1.5 and running on localhost
with respect to client, Win 2K. VM is 1.4.0
When I run the SELECT outside of a transaction, the
statement.executeQuery(sql) for the 2 rows takes 32 seconds the first
time, 6 seconds after that. I can't explain why it sometimes takes 5
times as long for the same query against the same data, maybe it's
what's in the server cache.
If I run the SELECT inside a transaction, executeQuery is instant,
but getBytes() on the BLOB column is slow and swings wildly:
Run # 1:
7 secs for 1.5 MB (first row) and 15 secs for 6.1 MB (second row)
Run # 2:
4 secs for 1.5 MB (first row) and 3 secs for 6.1 MB (second row)
Run # 3:
14 secs for 1.5 MB (first row), 6 seconds for 6.1 MB (second row)
Run # 4:
10 and 22 seconds
Run # 5:
8 and 6 seconds
It seems to me that the retrieval times are all over the place, why
is that ?
I cranked up the buffer sizes in FBManagedConnection and FBBlobField,
and while performance is somewhat better, it still swings widely.
I also monitored CPU utilization, and the FBServer process was using
hardly any CPU while the java process seemed to be maxed out... Any
ideas ?
Thanks,
Johannes