SQL Server 用データベースドライバーの比較



この記事のベンチマーク結果は、2020年5月時点で利用可能な最新のドライバーを使用して測定しています。

SQL Server は、Microsoft が開発した一般的なリレーショナルデータベース管理システム(RDBMS)です。この記事では、 大規模なデータセットを扱う際のネイティブ SQL Server JDBC ドライバー1と CData Software JDBC Driver for SQL Server2 の読み取りパフォーマンスを比較します。

CData ドライバーがネイティブドライバーと比較して、大規模なデータセットの読み取りを約23%高速に処理でき、 100万行の書き込みもネイティブドライバーより大幅に高速であることを示します。


テストデータ



読み取りパフォーマンスを再現可能な方法で比較するため、Amazon Customer Reviews データセット3から米国の書籍レビューを SQL Server データベースにコピーしました。amazon_book_reviews テーブルの詳細は以下のとおりです。

テーブルサイズ     テーブルの行数     カラム数
12.72 GB 10,237,177 15

JDBC ドライバーの読み取りパフォーマンス



この調査の主な目的は、JDBC ドライバー間のパフォーマンスを比較することでした。各 JDBC ドライバーで同じクエリセットを実行して比較を行いました。LIMIT 句を使用して各クエリで返されるデータセットのサイズを変更しましたが、各クエリで同じカラムをリクエストしました。

基本クエリ

SELECT
	marketplace,
	customer_id,
	review_id,
	product_id,
	product_parent,
	product_title,
	product_category,
	star_rating,
	helpful_votes,
	total_votes,
	vine,
	verified_purchase,
	review_headline,
	review_body,
	review_date,
FROM
  dbo.amazon_book_reviews;

クエリごとの制限

  1. LIMIT 1000000
  2. フルデータセット

ドライバーをテストするため、基本的な Java アプリケーションを使用して SQL Server に接続し、上記のクエリを繰り返し実行しました。結果を読み取り、各行の各カラムについてデータ型に基づいた新しい変数に格納しました。

ドライバー別クエリ時間(秒)
クエリ CData JDBC Driver SQL Server Connector/J
1(1,000,000行) 4.14 (+30.8%高速) 5.42
2(約10,000,000行) 52.46 (+22.9%高速) 64.49

結果からわかるように、CData ドライバーは Microsoft の SQL Server Connector を常に上回るパフォーマンスを発揮しました。これは主に、CData ドライバーがクライアント側のリソースを効率的に使用しているためです。

JDBC ドライバーのリソース使用量

JDBC ドライバーの読み取りパフォーマンスをテストする際、クライアント側のリソース使用量(特にメモリ)も測定しました。以下のグラフは、サンプル Java プログラムを実行し、Java VisualVM を使用してメモリ使用量をキャプチャしたものです。最大ヒープサイズ 8GB の Java OpenJDK バージョン 12.0.2 を使用しました。

この比較では、フルデータセットのクエリを実行しました。

CData ドライバー

ネイティブドライバー

CData ドライバーは、実行期間中平均で約 150 MB のヒープ使用量となっています。一方、ネイティブドライバーは平均で約 100 MB のヒープ使用量です。CData ドライバーは、利用可能なクライアント側のリソースをより効率的に活用することで、ネイティブドライバーよりも高速な読み取り速度を実現しています。


100万行チャレンジ



読み取りパフォーマンスに加えて、ドライバーの書き込みパフォーマンスも比較しました。結論として、CData SQL Server JDBC Driver は Microsoft のネイティブ SQL Server JDBC Connector よりも高速に100万行を書き込むことができます。

シンプルな Java プログラムを使用して、上記で参照した amazon_book_reviews テーブルのコピーに行を追加しました。3 テストでは、10,000行のバッチを100回に分けてデータを挿入しました。

サンプルコード

//1バッチ分の処理
Connection connection = DriverManager.getConnection("jdbc:sql:server=" + myServer + ";port=" + myPort + ";user=" + myUser + ";password=" + myPassword + ";database=" + myDatabse + ";");
connection.setAutoCommit(false);

String cmd = "INSERT INTO dbo.amazon_book_reviews_insert (marketplace, customer_id, review_id, product_id, product_parent, product_title, product_category, star_rating, helpful_votes, total_votes, vine, verified_purchase, review_headline, review_body, review_date) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pstmt = connection.prepareStatement(cmd);

for (int row = 0; row < rows.length; row++){
	pstmt.setString(1, marketplace);
	pstmt.setLong(2, customer_id);
	pstmt.setString(3, review_id);
	pstmt.setLong(4, product_id);
	pstmt.setLong(5, product_parent);
	pstmt.setString(6, product_title);
	pstmt.setString(7, product_category);
	pstmt.setLong(8, star_rating);
	pstmt.setLong(9, helpful_votes);
	pstmt.setLong(10, total_votes);
	pstmt.setString(11, vine);
	pstmt.setString(12, verified_purchase);
	pstmt.setString(13, review_headline);
	pstmt.setString(14, review_body);
	pstmt.setDate(15, review_date);

  pstmt.addBatch();
}

int[] affected = pstmt.executeBatch();
connection.commit();

結果

100万行の挿入時間(秒)
CData JDBC Driver SQL Server JDBC Driver
15.9 16.4

まとめ



CData ドライバーは、ネイティブドライバーと比較して大規模なデータセットのクエリにおいて優れたパフォーマンスを発揮します。 利用可能なクライアントリソースをより効率的に活用することで、最大のデータセットを少なくとも 20% 高速に処理します。 また、挿入処理においても CData JDBC Driver は優れており、100万行をわずか 15.9秒で挿入し、Microsoft のネイティブドライバーを大幅に上回ります。 CData の開発者は、データ接続がネットワーク通信とサーバー処理時間によってのみ制約されるレベルまで処理を最適化しています。

参考資料



  1. SQL Server Driver
  2. CData Driver
  3. Amazon Customer Reviews Dataset

始める準備はできましたか?

無料トライアルをダウンロード:

今すぐダウンロード

詳細:

SQL Server Driver

Microsoft SQL Server 連携のパワフルなJava アプリケーションを素早く作成して配布。