質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

3回答

9095閲覧

複数のCSVを同時にSQLへ読み込む

midsum0323

総合スコア40

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2017/12/01 02:20

###前提・実現したいこと
複数のCSVをpostgreSQLで次の順で読み込みたいと考えております
①各CSVをcopy文で読み込む
②読み込んだものを統合する

なお、先にCSVをwindowsのコマンドで統合し読み込むことはできたのですが、
100個程度計30GbのCSVを統合するのに半日以上かかり、
もう少し負荷を減らせないかと思い上記の方法を考えております。

※質問を分けたほうがいい場合はお申し付けください。

###元データ
moji1.csv
NO,komoji,omoji
1,a,A

moji2.csv
NO,komoji,omoji
2,b,B

moji3.csv
NO,komoji,omoji
3,c,C

##実現したいもの
テーブルMOJI
NO|komoji|omoji
1|a|A
2|b|B
3|c|C

##自作コード
不明な部分は/* 不明(理由) */と表記

--格納するテーブル
create table MOJI(
no,int
komoji,text
omoji,text
);

--ループ開始
--forでcsv読み込み
for i in 1..3 loop
--一時テーブル作成
create temp table mojitemp(
no,int
komoji,text
omoji,text
);

--csv読み込み
copy mojitemp from E'C:~/* 不明(ファイル名をどう表記するかわかりません) */.csv' with csv header;

--統合先へ
insert into MOji
select *
from mojitemp;

--iを1増やす
1=i+1;
end loop;
――loopおわり

###補足情報(言語/FW/ツール等のバージョンなど)
windows10
PostgreSQL 9.6.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

遅い理由はinsertを行っているからだと思われます。
insertによって考えられる遅い理由は2つ。
1.トランザクション量が多い
2.insert先のテーブルにインデックスがある。

1.についてはcopyコマンドで直接テーブルを指定することで解決すると思います。
2.については処理前にindexをdropし、データ投入後にinndexをcreateするようにすれば高速化が図れます。
※尚、pg_bulkloadを使用すれば、インデックスがあっても(というかあった方が)さらに高速に処理できます。

尚、投入先のデータは多分インデックスを使用されていると思いますが、その場合には、データ投入後にCLASTERを行って適切な状態にしてあげて下さい。

投稿2017/12/01 08:47

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windowsの環境が無いので想像ですが

bat

1FOR %i IN (moji*.csv) DO psql db -U hoge -c"copy MOJI from stdin with csv header" <%i

負荷の改善には成りませんが、複数処理を並列に実行すれば、時間は短くすることができると思います。
ディレクトリに分けて複数実行して早くなるかはマシンの性能に寄るところが大きいです。

ps:create table のカンマの位置が違っております。

投稿2017/12/01 03:34

編集2017/12/01 03:41
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

csvファイルのデータ形式は共通しているようですから、 [PostgreSQL]DB に大量データ インポートしてみた PostgreSQL編 ~ まとめ感想 の記事にあるような方法でcsvファイルを直接postgreSQLにインポートする方法が簡単なように思えます。
postgreSQLに入れる前に30GBものcsvファイルを生成する手間が減りますから。

投稿2017/12/01 03:03

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問