2013-08-04 10 views
10

Supponiamo la seguente query:Quando una query SELECT inizia a restituire righe?

SELECT * FROM table; 

Saranno i DBMS darmi la prima fila non appena recuperato o sarà in primo luogo recuperare tutte le righe (salvarli in una sorta di tampone) e poi me tutto dare le file in una volta?

Se la mia domanda non era chiara. Supponiamo che la quantità di righe nello table sia tale che il DBMS impiegherà esattamente 60 minuti per recuperare tutte le righe. Il DBMS restituirà le righe progressivamente durante i 60 minuti o dovrò attendere 60 minuti prima di ricevere dati?

+3

Hmmm ... interessante. Cosa suggeriscono i tuoi test? –

+0

@AndrewMorton Il mio test suggerisce che usi un qualche tipo di cache. Inoltre, credo che sarebbe più facile gestire le transazioni con l'approccio alla cache. Ma, ho provato solo con 'psql' finora, quindi non so se il comportamento è dovuto a' psql' oa causa dei dbms. –

+2

psql ha lo stesso comportamento tipico dell'applicazione semplice. È basato su libpq, quindi libpq raccoglie tutti i dati in memoria sul lato client e quando la query è completa, restituisce il controllo al client. Puoi ridefinirlo usando cursori impostando FETCH_COUNT su 1000 (ritorna al client dopo aver raccolto 1000 righe) - \ set FETCH_COUNT 1000 –

risposta

8

In PostgreSQL, il server restituirà effettivamente le righe al client non appena disponibili se il piano di esecuzione della query lo consente. Questo è il caso nel tuo semplice esempio. In altri casi, ad esempio, potresti avere un ordinamento alla fine e aspettare che finisca.

Ma se si utilizza l'interfaccia standard libpq, la libreria client creerà l'intero risultato in memoria prima di restituirlo al programma client. Per ottenere i risultati riga per riga, è necessario utilizzare lo single-row mode in libpq. Se si utilizzano altre interfacce o altre lingue, i risultati potrebbero variare.

+0

Conosci qualche soluzione prima del 9.2? –

+0

Utilizzare un cursore sul lato server. –

0

Dipende.

Ad esempio, il database Oracle sarà ottimizzare il throughput per impostazione predefinita e cercare di restituire tutte le righe, oppure si può istruire l'ottimizzatore di restituire i primi n righe con il `/ * + FIRST_ROWS (n) */optimizer hint.

Per quanto riguarda PostgresSQL, non ha suggerimenti optmizer (vedere i collegamenti thesetwo). Posso presumere che proverà a ottimizzare il throughput per impostazione predefinita.

+4

PostgreSQL non utilizza un suggerimento per questo scopo, ma quando si utilizza un cursore, la query viene ottimizzata per le prime 10% di righe veloci (valore predefinito di cursor_tuple_fraction). –

3

Non c'è una regola difficile qui. Ma in pratica, il motore del database dovrebbe preferire il ritorno delle righe non appena sono disponibili. Il vantaggio dell'efficienza è ampio ed evidente.

Si noti che questo non è possibile per tutte le query. Un esempio molto comune è una clausola order by che non ha indici di supporto. Per ordinare, il database deve creare una copia sul lato server della tabella che viene ordinata. Ciò significa che non può iniziare a restituire le righe fino al completamento dell'operazione di ordinamento.

1

La maggior parte, se non tutti, i server basati su SQL non consentono di visualizzare alcuna riga finché la query non completa la ricerca. Alcuni server forniscono una direttiva FIRST ROWS (un suggerimento) per consentire al server di fornire prima il primo set di righe. Vedere il mio correlato SO question and answers per maggiori informazioni su questo argomento.

Problemi correlati