概要
Verticaでテーブルデータをエクスポートする場合は、vsqlでCSV出力することができますが、大量データをCSV出力する場合、データ量に依存して出力に時間がかかることがあります。そのような場合、複数のセッションから並列実行することで出力する時間を高速化することができます。vsqlでCSV出力する方法の詳細に関しては下記URLを参照してください。
「SELECT結果をCSV出力する方法」
http://vertica-tech.ashisuto.co.jp/csv-output/
CSV出力を高速化するポイントは、複数セッションで処理する各セッションのSELECT件数をなるべく均等にすることです。例えば、4セッションから並列してCSV出力する場合、各セッションには出力するデータの25%ずつが割り当てられていることが望ましいです。
特定のセッションに件数が偏ってしまうと並列実行しても性能が出にくくなります。そのため、各セッションでなるべく均等に分割できる列データを特定することが重要になります。
実行例
各セッションで均等に分割できる列データをSELECTの条件に指定し並列実行します。条件に年を指定して年毎に分割する例と、一意キーのハッシュ値をもとに分割する例を以下に記載します。
以下はシェルを使用し4並列で実行する例になります。
■テーブルの年を条件に複数セッションで並列に処理する例
各セッションで取得するデータを年で分割します。
1 2 3 4 5 |
vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM TBL WHERE 年 = '2013';" >> dumpfile.csv & vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM TBL WHERE 年 = '2014';" >> dumpfile.csv & vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM TBL WHERE 年 = '2015';" >> dumpfile.csv & vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM TBL WHERE 年 = '2016';" >> dumpfile.csv & wait |
■一意キーのハッシュ値を条件に複数セッションで並列に処理する例
HASH関数に一意キーの列を指定しハッシュ値を取得します。
各セッションはハッシュ値を4で割った余数によって取得するデータを分割します。
1 2 3 4 5 |
vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM lineorder WHERE HASH(LO_LINENUMBER) % 4 = 0;" >> dumpfile.csv & vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM lineorder WHERE HASH(LO_LINENUMBER) % 4 = 1;" >> dumpfile.csv & vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM lineorder WHERE HASH(LO_LINENUMBER) % 4 = 2;" >> dumpfile.csv & vsql -U dbadmin -w vdb -F $'\t' -At -c "SELECT * FROM lineorder WHERE HASH(LO_LINENUMBER) % 4 = 3;" >> dumpfile.csv & wait |
性能検証
vsqlを使用して6億件のデータをCSV出力します。「並列実行:1」は、1セッションで6億件のデータをCSV出力します。
「並列実行:4」は、4セッションで6億件のデータを並列でCSV出力します。
データ件数 | 並列実行:1 | 並列実行:4 |
---|---|---|
6億件 | 67分 | 31分 |
実機による検証した結果、並列実行することで大幅に性能向上しました。
ただし、性能が向上する割合は、CPUやストレージなどH/Wのスペックによって変わりますので参考値としてご覧ください。