バッファリングされていない pdo ステートメントを介して取得しようとする、実行時間の長いクエリがあります (次のコードを参照)。しかし、バッファリングされていないクエリを「実行」するか、「fetchAll」を実行すると、タイミング(以下も参照)は実際にはあまり変化しません...バッファリングされていないクエリを実行してカーソルを与えるだけだと思いましたか?
get_db 関数は Zend_Db オブジェクトを返します。
l('Start 1');
$sql = get_db('ATO')->select()
... Big query...
->assemble();
l('Assembled');
get_db('APNS')->query($sql)->fetchAll();
l('All fetched... Going again!');
$PDOStatement = get_db('ATO')->getConnection()
->prepare($sql,
array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false));
l('prepared');
if ( $PDOStatement->execute() === false ) {
l(':(');
exit(1);
}
l('fetching');
while ( ($PDOrow = $PDOStatement->fetch()) !== false ) {
}
l ('all done');
function l($t) {
static $start = null;
if ( $start === null ) {
$start = microtime(true);
}
echo sprintf("[%0.5f] %s\n", microtime(true) - $start, $t);
}
そしてタイミング:
[0.00000] Start 1
[0.02262] Assembled
[214.69091] All fetched... Going again!
[214.69105] prepared
[417.01584] fetching
[420.55217] all done
ご覧のとおり、すべてのフェッチとバッファリングされていないバリアントのフェッチにほとんど違いはありません。
ここで何が間違っているのでしょうか?
ありがとう!