パフォーマンス低下でSnowflake 統合を停滞させないで

by Jerod Johnson 翻訳:兵藤朋代 | 2022年12月27日

Snowflake は、先進的なクラウドデータウェアハウスであり、企業のBI、分析、データ管理、およびガバナンス構想のバックボーンとしてよく利用されています。高速なクエリアクセス、ダイナミックな自動スケーリング、クラウドファーストアーキテクチャ、フルマネージドSaaS デリバリーモデルにより、クラウドデータ統合のための人気の選択肢となっています。

Snowflake への投資を最大限に活用するためには、Snowflake ウェアハウスへの最適な接続ソリューションが必要です。CData は、Snowflake データを使ってリアルタイムの洞察を得るための簡単なデータアクセスと、包括的なデータ保存のためのSnowflake への企業データの高速な挿入を実現します。

※本記事はCData US ブログ Don't Let Slow Performance Freeze Your Snowflake Integrations (CData Software) の翻訳です。

ドライバー・イン・フォーカス:Snowflake パフォーマンスベンチマーク

本記事では、CData JDBC Driver for Snowflake の技術的な機能の概要を説明し、CData JDBC Driver とネイティブのSnowflake JDBC Driver および競合他社のSnowflake 用JDBC Driver の大規模データセット処理時の読み出しおよび書き込み性能を比較します。

  • 読み出しパフォーマンス:CData JDBC ドライバーは、他のドライバーよりも10%~31%高速にデータセットを読み出します(より大きなデータセットではより良いパフォーマンスとなります)。
  • 書き込みパフォーマンス:CData JDBC ドライバーは、競合他社のドライバーよりも45%高速で、ネイティブドライバーよりも計り知れないほど高速に処理します。

使用したデータセット、実行したクエリ、CPU やJava ヒープ使用量などの結果について詳細をご覧ください。

JDBC ドライバーの読み出しパフォーマンス

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

データ

読み出しデータの再現性のある比較を行うため、共有データベースSNOWFLAKE_SAMPLE_DATA のTPC-H スキーマのORDERS テーブルをクエリしました。

テーブルサイズ 行数 カラム数
4.3 GB 150,000,000 9

ベースクエリ

SELECT

O_ORDERKEY,
O_CUSTKEY,
O_ORDERSTATUS,
O_TOTALPRICE,
O_ORDERDATE,
O_ORDERPRIORITY,
O_CLERK,
O_SHIPPRIORITY,
O_COMMENT

FROM

"SNOWFLAKE_SAMPLE_DATA"."TPCH_SF100"."ORDERS"

クエリによる制限

  1. LIMIT 1000000
  2. LIMIT 10000000
  3. none

ドライバーをテストするために、基本的なJava アプリケーションを使用してSnowflake に接続し、上記のクエリを繰り返し実行しました。結果は読み込まれ、各行の各カラムごとに新しい変数(データ型に基づく)に格納されました。下のグラフに表示されている時間は、各クエリの平均時間(秒単位)です。

クエリ結果

ドライバーによるクエリ時間(秒単位)
クエリ CData JDBC 競合JDBC Snowflake JDBC
1 (1M 行) 6.65 (+10.7%-22.1%) 7.45 8.54
2 (10M 行) 58.66 (+10.1%-18.9%) 65.23 72.38
3 (150M 行) 592.83 (+26.8%-31.4%) 863.63 809.82

結果に見られるように、CData JDBC Driver は他のドライバーを常に凌駕し、結果の取得と処理を最大31%も高速化しました。

JDBC Driver のリソース使用量

JDBC ドライバーの読み出しパフォーマンスをテストする一方で、クライアント側のリソース使用量も測定し、特にメモリとCPU の使用量に注目しました。以下のグラフは、サンプルのJava プログラムを実行し、Java VisualVM を使用してCPU とメモリの使用量をキャプチャしたものです。Java version 8 update 333を使用し、ヒープサイズの最大値はなしとしました。

以下の画像は、1億5千万行を読み出した場合のリソース使用量を示しています。

* ヒープグラフのスケールを変更したことに注意してください。

CData ドライバーの読み込み時のヒープ使用量は平均1000MB 以上で、自由に使えるメモリリソースを最大限に活用して他のドライバーを凌駕しています。また、CData ドライバーは常に利用可能なCPU の約10%を使用し、データが返されるのと同じ速さで継続的に処理していることがわかります。

競合ドライバーは、無制限に使用できるヒープを平均200MB しか使用していません。競合ドライバーはCPU 使用率も一貫しておらず、20%近くまで急上昇しており、受信データの処理が不安定であることを示しています。

ネイティブドライバーは、無制限のヒープを平均350MB 使用しています。ネイティブドライバーは競合ドライバーと同様CPU に一貫性がなく、20%近くまで急上昇し、受信データの処理が不規則であることを意味しています。

100万行チャレンジ

この比較では、Snowflake テーブルに 100 万行を挿入するというタスクをドライバーに課しました(このタスクはネイティブドライバーでは完了できませんでした)。CData JDBC ドライバーは、競合ドライバーより45%高速で、クライアント側のリソース使用に関してもより効率的でした。ネイティブドライバーはタスクを完了することなく、行の挿入に4時間以上を費やしました。

TPC-H スキーマのORDERS テーブルのコピーに行を追加するために、簡単なJava プログラムを使用しました。テストでは、10,000行のバッチを100回に分けてデータを挿入しました。

サンプルコード

//one batch
Connection connection = DriverManager.getConnection("jdbc:googlebigquery:InitiateOAuth=GETANDREFRESH;QueryPassthrough=false;ProjectId=" + projectId + ";DatasetId=" + datasetId + ";Timeout=240;UseLegacySQL=false;");
String cmd = "INSERT INTO TestDataset.nyc_yellow_trips_copy (vendor_id, pickup_datetime, dropoff_datetime, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude, rate_code, passenger_count, trip_distance, payment_type, fare_amount, extra, mta_tax, imp_surcharge, tip_amount, tolls_amount, total_amount, store_and_fwd_flag) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pstmt = connection.prepareStatement(cmd);

for (int row = 0; row < rows.length; row++){
String[] line = rows[row].split(",");
for (int i = 0 ; i < line.length; i++) {
//add parameters based on datatype
if ( (i < 3) || (i ==7) || (i==10) || (i==18) ) {
pstmt.setString(i + 1, line[i]);
} else if (i == 8) {
pstmt.setInt(i+1, Integer.parseInt(line[i]));
} else {
pstmt.setDouble(i+1, Double.parseDouble(line[i]));
}
}
pstmt.addBatch();
}

int[] affected = pstmt.executeBatch();

結果

ドライバー別100万行書き込み時間(秒単位)
CData JDBC Driver 競合ドライバー ネイティブドライバー
52.38 94.57 4+ hours

結論

CData JDBC Driver for Snowflake は、ネイティブドライバーと競合ドライバーのいずれよりも大規模データセットに対するクエリパフォーマンスが優れており、利用可能なクライアントリソースをより有効に活用してデータをできるだけ迅速に読み出し処理することにより、最大データセットを31%高速に処理します。

データの書き込みに関しては、CData JDBC Driver は他社製ドライバーを凌駕し、100万行の挿入を他社製品よりも50%近く高速化しました(4時間経ってもタスクを完了できなかったネイティブドライバーと比較すると計り知れないほど高速です)。

当社の開発者は、Snowflake から返される結果を処理する際のパフォーマンス最適化に尽力し、その結果ドライバーはWeb 移動時間とサーバ処理時間によってのみ阻害されるのみになりました。また、Snowflake の書き込み機能を効率的に利用するための努力も行っており、Snowflake データウェアハウスからの読み出しと書き込みの両方において、CData ドライバーが明らかに優っていることを証明しています。

ぜひCData JDBC Driver for Snowflake 30日間無償評価版をダウンロードして試してみてください。

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。