既存のテーブルのデータを別のテーブルにINSERTするときは、以下のようにINSERT…SELECT文を使用することがあります。
例)t1テーブルをSELECTした結果をt2テーブルにINSERTする場合
1 |
mysql> INSERT INTO t2 SELECT * FROM t1 WHERE hanbai_date < '2013-12-31'; |
列指向型のデータベースであるInfiniDBは、INSERT処理は汎用的な行指向のデータベースに比べて得意ではありません(相対的に処理に時間がかかります)。
そのため、InfiniDBでこのような処理を高速化したい場合は、InfiniDBのロードツールであるcpimportとSELECTを組み合わせる方法を検討してください。
1 |
# idbmysql -e '実行したいSELECT文' -N test | cpimport データベース名 テーブル名 -s '\t' |
例)SELECT * FROM t1 WHERE….の検索結果をt2テーブルに挿入(ロード)する場合
1 |
# idbmysql -e 'SELECT * FROM t1 WHERE hanbai_date < "2013-12-31";' -N test | cpimport test t2 -s '\t' |
InfiniDBに付属しているバルクロードツール「cpimport」はcsvやバイナリデータを高速にロードすることができます。これを応用して、上記のようにSELECTした結果をLinuxのパイプ「|」でcpimportに渡すことで、cpimportはそのSELECT結果を通常のロード処理と同じようにロードします。
InfiniDBは元々SELECT処理は得意なので、INSERT….SELECT文を実行してもSELECTの部分は高速に処理することができます。苦手であるINSERTの部分をcpimportで補うことで、他テーブルのデータ挿入(ロード)も高速に行うことができます。