Home > PHP > PHPからPostgreSQLに大量のデータを登録する

PHPからPostgreSQLに大量のデータを登録する

  • 2007-03-16 (金) 10:11
  • PHP
この記事の所要時間: 18

PostgreSQLに大量のデータを登録する際はINSERTを使って一件づつ処理するより、COPYを使って一気に登録した方が実行速度が(かなり)速いです。

そこでPHPでもCOPY文を使ってみましょう。

pg_copy_fromを使う

登録するデータが配列に入っているならpg_copy_fromだけで一気に処理できます。

配列の1要素が1レコードに対応しています。1要素内では各カラムをデリミタ(デフォルトは”\t”)で連結します。

<?php
$values = array();
$values&#91;&#93; = "1\tname1";
$values&#91;&#93; = "2\tname2";
$values&#91;&#93; = "3\tname3";

$db = pg_connect("dbname=hogedb");
pg_copy_from($db, 'table', $values);
?>

単純なCSVならデリミタを[,]に変えればokです。

<?php
$values = array();
$values&#91;&#93; = "1,name1";
$values&#91;&#93; = "2,name2";
$values&#91;&#93; = "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も可能です。

数万件レベルのデータでも体感できる程パフォーマンスが違うので、もし知らない方は一度お試しあれ。

Pocket

follow us in feedly

トラックバック:1

このエントリーのトラックバックURL
http://www.1x1.jp/blog/2007/03/php_pgsql_copy.html/trackback
Listed below are links to weblogs that reference
PHPからPostgreSQLに大量のデータを登録する from Shin x blog
trackback from 酒日記 はてな支店 07-03-16 (金) 20:23

Perl + DBD::Pg で COPY を使う…

以前、ベンチマーク取ったことがあるので書いておこう。 PostgreSQLに大量のデータを登録する際はINSERTを使って一件づつ処理するより、COPYを使って一気に (more…)

Home > PHP > PHPからPostgreSQLに大量のデータを登録する

検索
フィード
メタ情報

Return to page top