2016-07-04 101 views
5

Con questo codice, anche se vado a prendere una singola riga - l'intero set di dati viene scaricato (che richiede pochi secondi):Come fare DOP (pdo_pgsql) per andare a prendere pigramente le righe

$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; 
} 

ho cercato di trovare un opzione in PDO che renderebbe il recupero di righe su richiesta (o per lotti ragionevoli), ma non è riuscito a farlo, almeno non ho potuto trovarlo nella documentazione PDO.

Postgresql per la query fornita è in grado di servire la prima riga in 0.28ms come da EXPLAIN ANALYZE.

E il mio obiettivo è quello di iniziare l'elaborazione delle righe il più velocemente possibile, anche se verranno aggiunti ulteriori lotti di righe con un sovraccarico di rete.

Come Decisi che recupera tutte le righe:

  1. Indirettamente: ci vuole tempo stesso break dopo la prima riga o per scorrere su tutta dataset
  2. ho catturato il traffico con tcpdump e controllato che recupera tutte le righe.

Quindi, la domanda è: è possibile fare PDO per andare a prendere in una riga per riga (o alcuni piccoli lotti ragionevoli) sulle modalità di richiesta?

+0

io sono sicuro, ma hai visto questo (flag PDO :: FETCH_LAZY): http://stackoverflow.com/qu estions/14462156/php-pdofetch-lazy-not-creation-object-variable-names-as-they-are-access e da PHP doc: http://php.net/manual/en/pdostatement.fetch.php – pah

+0

@threadp 'FETCH_LAZY' è un nome fuorviante, non fa quello che sembra dovrebbe :-D – zerkms

+0

Esatto, ho appena ricevuto quello dalla tua risposta :) grazie – pah

risposta

3

ho trovato la risposta:

$stmt = $db->prepare($query, [\PDO::ATTR_CURSOR => \PDO::CURSOR_SCROLL]); 

Quindi la dichiarazione deve essere creato con un'opzione \PDO::CURSOR_SCROLL

Riferimenti: