i-net Software BenchTest 2.1 for MS SQL Server Results

These are the results of running i-net Software's BenchTest 2.1 for MS SQL Server. The tests were run against an SQL Server 2000 over a 100Mbit network connection. The client machine was an AMD Duron 900MHz with 512MB RAM (no idea about the server).

5 drivers were tested: i-net Merlia 6.0, Microsoft SQL Server Driver for JDBC SP2, JNetDirect JSQLConnect 3.3023, jTDS 0.7 and the JDBC-ODBC bridge bundled with J2RE 1.4.2-b28. All tests were run twice and the final result is the average of the two test runs.

Unfortunately, the license of NetDirect JSQLConnect does not allow any benchmarking results to be made public, but it has failed the CursorUpdate test and the results would not have affected the final standings too much. If you want some more exact results for JSQLConnect, download it and the i-net Software BenchTest and do the testing yourself. It's very easy.

Tests run with rowcount = 1000

  i-net Merlia MS MS Cursor1 jTDS ODBC2
UnpreparedInsert 10927 10510 10395 10154 11114
DeleteAll 215 986 651 591 1082
CursorInsertEmpty 11215 11687 11777 11475 11225
CursorDelete 10845 10745 10745 10395 Failed
CursorInsert 17951 13419 13539 12273 Failed
CursorFetchPaged 1242 8492 8412 2354 Failed
CursorUpdate 16523 21680 13892 13518 Failed
PreparedUpdate 13925 12659 13268 12097 Failed
PreparedUpdateWProc 14099 13148 13149 10024 Failed
BatchPreparedUpdate 4015 4107 4426 3425 Failed
ResultSetReadAllRows 901 951 1002 401 Failed
PreparedBlobUpdate 140 281 280 211 Failed
PreparedBlobUpdateWProc 110 Failed 110 180 Failed

Tests run with rowcount = 100

  i-net Merlia MS MS Cursor1 jTDS ODBC2
UnpreparedInsert 916 931 981 952 901
DeleteAll 30 20 20 30 20
CursorInsertEmpty 972 1041 981 901 957
CursorDelete 931 1152 1102 901 Failed
CursorInsert 1953 1237 1351 1157 Failed
CursorFetchPaged 370 1402 1272 510 Failed
CursorUpdate 1778 2533 1732 1362 Failed
PreparedUpdate 1382 1177 1051 962 Failed
PreparedUpdateWProc 1132 1131 1132 871 Failed
BatchPreparedUpdate 295 441 410 320 Failed
ResultSetReadAllRows 70 151 131 75 Failed
PreparedBlobUpdate 40 20 20 35 Failed
PreparedBlobUpdateWProc 15 Failed 20 15 Failed

The tests explained

All tests use a table with an INT primary key and nullable columns of each SQL Server base type (about 20 in all). The rowcount is a parameter that determines the size of each test (number of rows inserted/updated/retrieved or Blob size).

  • UnpreparedInsert - Insert rowcount rows with default values with a classic INSERT using a plain statement.
  • DeleteAll - Delete all rows with a single statement ('DELETE FROM Table'). Not very relevant, it only tests the server, that's why the results vary so wildly from the 1000 rows test to the 100 rows test.
  • CursorInsertEmpty - Insert rowcount rows using insertRow() and without setting the value of any column.
  • CursorDelete - Delete rowcount rows using deleteRow().
  • CursorInsert - Insert rowcount rows with setting all columns (one column for each type supported by SQL Server, except TEXT/IMAGE).
  • CursorFetchPaged - Create a scrollable ResultSet, set the fetch size to rowcount/100 and scroll through it. (jTDS doesn't "know" how to fetch more than one row of a cursor-based ResultSet at once yet, so it's somewhat slower than the i-net driver, but still a lot faster than the others.)
  • CursorUpdate - Update rowcount rows using updateRow().
  • PreparedUpdate - Update rowcount rows using a classic UPDATE with a PreparedStatement.
  • PreparedUpdateWProc - Update rowcount rows using a stored procedure with a PreparedStatement.
  • BatchPreparedUpdate - Update rowcount rows using a classic UPDATE with a PreparedStatement and executeBatch() in batches of 10 updates.
  • ResultSetReadAllRows - Scroll through a scrollable ResultSet and call the getXXX() methods for each column.
  • PreparedBlobUpdate - Update a Blob of rowcount KB using a classic UPDATE with a PreparedStatement.
  • PreparedBlobUpdateWProc - Update a Blob of rowcount KB using a stored procedure with a PreparedStatement.

1 MS Cursor stands for the Microsoft driver with SelectMethod set to 'Cursor' (the other uses the default 'Direct' method).
2 The JDBC-ODBC bridge failed on the CursorDelete test and closed the connection causing the rest of the tests to also fail.