- 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