我使用PHP5.3.6和PDO访问Postgres 9.0.4。我被要求减少报告的内存占用。当前的实现很简单:执行查询,执行一个fetchAll(),然后使用foreach()遍历得到的数组。这显然不会对结果集产生很大的影响:它可以临时消耗100 or或更多。
我有一个新的实现,它接受PDO语句句柄,然后使用foreach()直接在其上迭代,即没有通过fetchAll()的中间数组。(根据我所读到的,在封面下使用foreach调用来迭代语句句柄。)这同样快速,消耗了way更少的内存:大约28 as。尽管如此,我仍然不确定我做得对,因为尽管我已经做了大量的谷歌搜索,但很难找到关于这方面的基本问题的答案:
我发现,如果我这样做,就没有记忆和速度上的差别:
$sth = $dbh->prepare($sql, array( PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY ) );这是因为对于Postgres驱动程序来说,这是默认的吗?如果它已经在内部使用游标,这将是有意义的。
欢迎对解决这一问题的方法和其他方法提出一般性意见。
发布于 2011-10-24 15:46:28
PDO为Postgres 在内部使用游标吗。
发布于 2014-05-20 16:39:42
显然,PDO::CURSOR_FWDONLY不使用游标。黑匣子测试:
(0)筹备工作:
$con = new \PDO('dsn');
// you'll get "NO ACTIVE TRANSACTION" otherwise
$con->beginTransaction();
$sql = 'select * from largetable';(1)违约-需要永远:
$stmt = $con->prepare($sql);
$stmt->execute();
print_r($stmt->fetch());(2) FWDONLY -永远:
$stmt = $con->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));
$stmt->execute();
print_r($stmt->fetch());(3)可滚动的--瞬间运行:
$stmt = $con->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL));
$stmt->execute();
print_r($stmt->fetch());我打开PG日志只是为了确定,这确实是唯一的卷轴使用游标。
因此,使用游标的唯一方法是使用滚动,至少在PHP 5.4.23中是这样。
https://stackoverflow.com/questions/7878138
复制相似问题