- 2007-03-16 (金) 10:11
- PHP
この記事の所要時間: 約 1分8秒
PostgreSQLに大量のデータを登録する際はINSERTを使って一件づつ処理するより、COPYを使って一気に登録した方が実行速度が(かなり)速いです。
そこでPHPでもCOPY文を使ってみましょう。
pg_copy_fromを使う
登録するデータが配列に入っているならpg_copy_fromだけで一気に処理できます。
配列の1要素が1レコードに対応しています。1要素内では各カラムをデリミタ(デフォルトは”\t”)で連結します。
<?php
$values = array();
$values[] = "1\tname1";
$values[] = "2\tname2";
$values[] = "3\tname3";
$db = pg_connect("dbname=hogedb");
pg_copy_from($db, 'table', $values);
?>
単純なCSVならデリミタを[,]に変えればokです。
<?php
$values = array();
$values[] = "1,name1";
$values[] = "2,name2";
$values[] = "3,name3";
$db = pg_connect("dbname=hogedb");
pg_copy_from($db, 'table', $values, ',');
?>
pg_put_lineを使う
登録するデータを一件ずつ処理したいならpg_put_lineで1レコードずつ出力する方法します。
はじめにCOPY文を発行しているので、デリミタの指定などSQL内で変更できます。
登録データ出力後に[\.]を発行してから、最後にpg_end_copyを呼ぶ必要がありますのでご注意を。
<?php
$db = pg_connect("dbname=hogedb");
pg_query($db, "copy table from stdin");
for ($i = 1 ; $i <= 10 ; $i++) {
$line = sprintf("%d\tname%d\n", $i, $i);
pg_put_line($db, $line);
}
pg_put_line($db, "\.\n");
pg_end_copy($db);
?>
ちなみにPostgreSQLではCOPY文もトランザクション内に含める事ができます。当然ROLLBACKも可能です。
数万件レベルのデータでも体感できる程パフォーマンスが違うので、もし知らない方は一度お試しあれ。
- Newer: SmartyでSJISテンプレートを使う
- Older: Zend PHP 5 Certification self test
トラックバック:1
- このエントリーのトラックバックURL
- /blog/2007/03/php_pgsql_copy.html/trackback
- Listed below are links to weblogs that reference
- PHPからPostgreSQLに大量のデータを登録する from Shin x blog

