目的
前回はICOS上のファイルをSQLQueryによりDB2テーブルにLoadを実施して処理時間を測定しましたが、DB2Nativeに実施するのに比べて性能が劣化するという結論を得ました、本文書ではPARALLELISM機能を利用してSQLQueryの性能チューニングを検証します。
IBM Cloud Object StorageファイルをDB2へロードする(1)
IBM Cloud Object StorageファイルをDB2へロードする(2) ~ SQL Query性能チューニングについて: 本文書
なおIBM Cloud SQL Queryは2022年5月よりIBM Cloud Data Engineにサービス名称が変更になりました。
性能チューニングについて
SQLQueryではDB2に結果を書き出す時に限りPARALLELISM x 節を使用して、複数の並列データベース接続を開くことを指定することがサポートされます。
IBM Cloud DOCでは下記の通り処理時間が短縮される可能性がある旨記述があり検証を実施しました。
dbResultClause
https://cloud.ibm.com/docs/sql-query?topic=sql-query-sql-#dbResultClause
抜粋
PARALLELISM x 節を使用して、結果を書き出すために複数の並列データベース接続を開くことを指定します。 この指定を行うと、結果のサイズと、ターゲット・データベース・サービスのネットワーク接続状態によっては、 照会の処理時間が大幅に短縮される可能性があります。
またSQLQueryはSpark/Queryをベースにしており、その並列処理を最大限に活かすため、事前に複数のCSV/Parquetファイルに分割(Partition化)しておき、PARALLELISMを10~20に指定して複数のDB2接続をオープンして並列Loadを実施し処理時間を測定しました。
1.環境
- SQLQuery@Dallas, ICOS@Tokyo, DB2on IBMCloud@Tokyo(2Core 8GBRAM)のインスタンスを活用
- SQLQueryはWebコンソールを利用して、Query実行、時間を測定
2.検証手順
下記のようなSQL文(サンプル)を実行しています。
#CSVファイルから10個のParquetファイルにPartition化
SELECT *
FROM cos://jp-tok/dbload/data500.csv STORED AS CSV
into cos://jp-tok/dbload/500MPAQ STORED AS parquet
partitioned into 10 objects
#CSVファイルから10個のcsvファイルにPartition化
SELECT *
FROM cos://jp-tok/dbload/data500.csv STORED AS CSV
into cos://jp-tok/dbload/500MCSV STORED AS CSV
partitioned into 10 objects
#Partition化されたParquetファイルをDB2にロード,parallelismは5を指定
SELECT *
FROM cos://jp-tok/dbload/500MPAQ/* STORED AS parquet
into crn:v1:bluemix:public:dashdb-for-transactions:jp-tok:a/039dbe6794084c7cb514a276dd2345da:4299a8bc-68c6-4080-895f-cfa4e3cf78fe::/EMPLOYEE40
with parallelism 5
3.検証結果
4.結果考察
◼︎100MB以上のファイルで性能向上が見られる
(ファイルサイズが小さいとSQLQueryのOverHeadが大きい、開発元の推奨は100MByte以上)
◼︎10個のParquetに分割されたFileで、10~20のParallelism処理によりロード時間は1/3~1/4に短縮された(Partition化された複数ファイルのロードでParallelismの効果は大きい)
◼︎CSVに比べるとParquetの効果が大きい
(SQLQueryはリモート処理になるので圧縮効果の高いParquetの効果がより大きい)
◼︎500MB以上のファイルではDB2Deadlock/timeoutを発生させ処理が中断(別途チューニング要)
◼︎SQLQueryでParquet分割/Parallelism利用したとしてもDB2Nativeに比べると依然遅い
*現時点ではDB2 NativeではParquetファイルを直接外部表として指定することはサポートされていません。
まとめ
SQLQueryでは馴染みのある(ANSI SQLに準拠した)SQL Select文でICOS上のファイルを簡易にデータ変換/分析を行えます。その際列ベースのParquetフォーマットに分割して処理すれば性能/コスト(ストレージ消費量)の観点から大変有利になります。また結果はICOSだけでなくDB2に保管することも可能です。その時Parallelismを併用して並列ロードすれば処理時間は大幅に短縮されます。
リンク先
dbResultClause
https://cloud.ibm.com/docs/sql-query?topic=sql-query-sql-#dbResultClause
IBM Cloud Object StorageファイルをDB2へロードする(1)
https://qiita.com/nori0315/items/779fc8d543658d2225a1