2016-07-04 31 views
5

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:

  1. pośrednio: to zajmuje tyle samo czasu na break po pierwszym rzędzie lub iteracyjne w całym zbiorze
  2. 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?

+0

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

+0

@threadp 'FETCH_LAZY' jest mylącą nazwą, nie robi tego, co brzmi, powinien :-D – zerkms

+0

Dobrze, właśnie dostałem to z twojej odpowiedzi :) dzięki – pah

Odpowiedz