z następującego kodu chociaż przynieść jeden wiersz - cały zestaw danych jest pobierany (co trwa kilka sekund):Jak PDO (pdo_pgsql) do leniwie pobrać wierszy
$query = 'SELECT * FROM xxx WHERE id > :position ORDER BY id';
$stmt = $db->prepare($query);
$stmt->execute([
':position' => $position,
]);
while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
break;
}
Starałem się znaleźć opcja w PDO, która powodowałaby pobieranie wierszy na żądanie (lub w uzasadnionych partiach), ale nie udało się tego, przynajmniej nie mogłem znaleźć tego w dokumentacji PDO.
Postgresql dla zadanego zapytania jest w stanie obsłużyć pierwszy wiersz w 0.28ms
zgodnie z EXPLAIN ANALYZE
.
Moim celem jest rozpoczęcie przetwarzania wierszy tak szybko, jak to możliwe, nawet jeśli kolejne partie wierszy pojawią się z pewnym obciążeniem sieci.
Jak ustalono, że to pobiera wszystkie wiersze:
- pośrednio: to zajmuje tyle samo czasu na
break
po pierwszym rzędzie lub iteracyjne w całym zbiorze - I uchwycił ruch z
tcpdump
i sprawdził, czy pobiera wszystkie wiersze.
Pytanie brzmi: czy można wykonać PDO
w celu pobrania w trybie rząd po rzędzie (lub niektórych rozsądnych małych partii) w trybie popytu?
jestem pewien, ale czy widziałeś to (flaga PDO :: FETCH_LAZY): http://stackoverflow.com/qu estions/14462156/php-pdofetch-lazy-not-creation-object-variable-names-as-one-is-is-is-defined oraz z PHP doc: http://php.net/manual/en/pdostatement.fetch.php – pah
@threadp 'FETCH_LAZY' jest mylącą nazwą, nie robi tego, co brzmi, powinien :-D – zerkms
Dobrze, właśnie dostałem to z twojej odpowiedzi :) dzięki – pah