[pgsql-jp: 37719] Re: INDEX を残したまま大量データを高速に挿入したい

河本陽一 komoto.yoichi @ kcc.co.jp
2006年 11月 24日 (金) 13:54:06 JST


こうもとです。

a.mitani さんの書いたこと:
> こんな感じでどうでしょう.
> 
> test=# create table t1 (tdata text);
> CREATE TABLE
> test=# create view v_t1 as select tdata, count(tdata) as tcnt from t1
> group by tdata;
> CREATE VIEW
> test=# copy t1 from '/tmp/test.load' ;
> COPY

 元データをそのままDBにCOPYで放り込むという意味だったんですね。
 元データはCSV形式なので、区切り文字を指定すればそのまま取り込めそ
うです。

 後の処理のために、フィールドから特定の文字列を取り出したものを別の
フィールドに持とうとしています。
 このフィールドは、二つの本テーブルに使いますが、このくらいであれば、
二つのVIEWそれぞれで処理しても問題ないかと思っています。
 さらに中間ファイルを作るほうが、コストがかかるのではないかと。


 ふとおもったのは、フィールドのデフォルト値に、別フィールドの演算結
果を指定すれば、COPY時に必要なフィールドが全て出来上がるのではないか
ということです。
 ためしに、以下のようなテーブルを作ろうとしましたが、だめでした。

# CREATE TEMP TABLE ttt (t1 text, d1 date default t1);
ERROR:  cannot use column references in DEFAULT clause

 「DEFAULTの条件に、カラムへの参照は使用できない」といっているよう
なので、COPYしつつデータ処理というのは無理なのかもしれません。
 VIEWで代用できると思いますが、同じ処理が2回走るのでちょっと無駄か
と思ったので。

 上で、text形式のフィールドをdate形式のフィールドのデフォルト値とし
たいのは、元データの日付が「14/Mar/2006:00:00:06」の形式となっており、
さらに、最終的にほしいデータもこの形式なので、別フィールドに持とうと
しました。
 元データの形式をtimestampフィールドに指定すると、きちんとフォーマッ
トを認識したので、フォーマット変換はDBに任せられるようです。


======================================================================
河本陽一(こうもとよういち)
mailto:komoto.yoichi @ kcc.co.jp




pgsql-jp メーリングリストの案内