LoginSignup
5
6

More than 3 years have passed since last update.

PDOでPostgresqlから大量のデータをSELECTする(メモ)

Last updated at Posted at 2019-05-29

何も考えずに70万件くらいのテーブルから全データSELECTしたらメモリが足りなくなってしまいました。(当然)

結論

メモリがたりない

$selectSql = "SELECT * FROM でかいテーブル";
// query() すると結果のデータがPHPのメモリに乗ってしまい、メモリが足りない。
$statement = $this->query($selectSql);

while($row = $statement->fetch(PDO::FETCH_ASSOC)){
    //なんなりと
}

だいじょうぶ

$selectSql = "SELECT * FROM でかいテーブル";
// 以下オプション付きでprepareすればOK。
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
// 実行
$statement->execute();
//第二引数はデフォルト値と同じなので、省略しても良い
while($row = $statement->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)){
    //なんなりと
}

感想

パラメタの無い単なるSELECT文をプリペアドステートメントで実行するという発想がなかった。。

注意点

//prepare の場合、rowCount() が取れない
$selectSql = "SELECT * FROM でかいテーブル";
$statement = $this->pdoSource->prepare($selectSql,[PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL]);
$statement->execute();
$statement->rowCount();//0件

参考

https://www.php.net/manual/ja/pdo.prepare.php
https://www.php.net/manual/ja/pdostatement.fetch.php

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6