Estrarre risultati da postgresql con cursori

2

Sto scrivendo un'applicazione in C ++ usando libpq come interfaccia per postgresql. Attualmente sto mettendo insieme una piccola libreria di funzioni di supporto per aiutare a gestire la conversione da C ++ a C per un'applicazione da utilizzare su un PC o un dispositivo ARM (RAM da 2 GB a 2 GB).

Per quanto riguarda il prelievo di dati dal database, sono preoccupato di dover estrarre tutti i risultati dal database in una volta sola, o utilizzare un cursore per leggerne uno o alcuni alla volta.

Il set di risultati restituito potrebbe probabilmente essere nelle centinaia e presumo:

  • se tiro tutti i risultati, sarà un colpo di memoria per l'applicazione
  • se estraggo una tupla alla volta tramite un cursore, potrebbe essere un grosso onere per il server del database (attualmente localhost per lo sviluppo)

Non capisco come potrei ottenere alcune metriche adatte per determinare quale sarebbe il migliore, quindi le mie domande sono:

  1. Esiste una best practice quando si tratta di recuperare i risultati dal database nel mondo reale (tutto in una volta / una riga alla volta / poche righe alla volta)
  2. Come potrei determinare una qualche forma di metrica per testare l'efficienza? Immagino che dovrei prendere in considerazione sia l'utilizzo della memoria dell'applicazione che il carico del database insieme al tempo di risposta.
  3. Se è meglio tirare qualche tupla alla volta, come faccio a determinare la quantità ottimale da tirare in una volta?
posta user3791372 09.08.2014 - 16:56
fonte

1 risposta

1

Dalla nostra esperienza, i cursori causano più problemi di quanti ne valgano. SQL riguarda set di risultati, ed è quello che dovresti affrontare. L'ideale è decidere alcune dimensioni del set di risultati che ottimizzano il traffico di rete e l'utilizzo della memoria dell'applicazione e vedere se è possibile fornire entro tale limite. Le visualizzazioni delle liste a scorrimento lo stanno facendo da sempre.

  • Per le query su un indice puoi DOVE e LIMIT.
  • Per molte (più semplici) query puoi usare OFFSET e LIMIT.
  • Verifica l'ottimizzatore: potrebbe funzionare anche per query complesse, ma non vuoi eseguire la query due volte.
  • A seconda dell'API, potrebbe essere possibile creare una stored procedure e una tabella temporanea.
risposta data 10.08.2014 - 10:23
fonte

Leggi altre domande sui tag