Query su singolo database con iterazione in-codice vs Multiple query di database

1

Dire che esiste una singola tabella di database contenente informazioni su due diversi tipi di animali: animali terrestri e animali marini.

Voglio creare due elenchi di animali, un elenco per ogni tipo di animale.

È una pratica migliore interrogare tutti gli animali dal database, scorrere l'elenco restituito degli animali e inserirli nell'elenco appropriato. per esempio:.

land_animals = []
sea_animals = []

animals = database.query('SELECT * FROM animals;')

for animal in animals:
    if animal.type == 'land':
        land_animals.append(animal)
    else:
        sea_animals.append(animal)

Oppure, è meglio fare due query separate sul database per recuperare il tipo specifico di animali per elenco. per esempio:.

land_animals = database.query('SELECT * FROM animals WHERE type="land";')
sea_animals = database.query('SELECT * FROM animals WHERE type="sea";')

Credo che la mia domanda si riduce a quella che è la pratica migliore più costosa :

  1. Un'iterazione in-codice su tutti gli animali nel database.
  2. Più query al database.
posta bovus 07.11.2018 - 22:58
fonte

3 risposte

2

"Meglio" potrebbe avere molti significati. Questa è una domanda complicata e la risposta richiederebbe alcune ipotesi. Ad ogni modo, aggiungerò i miei 2 centesimi ...

Nel tuo caso, e l'indice non aiuterà. L'ottimizzatore probabilmente lo ignorerà poiché hai solo 2 tipi.

Per eseguire la query sul server, puoi prendere in considerazione 3 fattori che influenzano la velocità di risposta:

  1. Tempo di connessione - Può essere risolto con un pool di connessioni di grandi dimensioni.

  2. Tempo di esecuzione delle query - Può essere affrontato in molti modi, come ad esempio la corretta progettazione delle tabelle, la creazione di buoni indici, ecc. Ma in questo caso, ciò non sarà di aiuto. Prova a non usare SELECT * se puoi e ottieni solo le colonne necessarie.

  3. Tempo di comunicazione tra il client e il server - Può essere indirizzato rendendo i dati trasferiti più piccoli quando possibile (si sovrappone anche a 2).

Da quanto sopra, possiamo dire che, per eseguire 2 query separate, dovrai:

A - Effettua 2 connessioni dal client al server.

B - Leggi l'intera tabella 2 volte, 1 per ogni query, poiché presupponiamo che l'indice verrà ignorato.

Supponendo che:

  1. La rete gestirà qualsiasi dimensione di dati in modo lineare e

  2. La rete può gestire il trasferimento dei big data e

  3. Il server di database non rilascia la connessione nel mezzo (grandi rischi) e

  4. L'applicazione può contenere l'intero set di risultati restituito in memoria,

  5. Il tempo richiesto per leggere i dati dal disco è inferiore al tempo necessario per inserire i dati in una struttura di programma come un array.

Quindi, suppongo che il filtraggio dei dati sul client sarebbe più rapido da un punto di vista prestazionale, perché useresti 1 connessione al database e 1 la lettura della tabella dal disco dal database, la seconda lettura sarà dalla memoria solo.

La differenza potrebbe non essere percepita a meno che la tabella non sia molto grande.

Detto ciò, proverei ancora a lasciare che il database faccia il filtraggio ed emetta due query separate. Questo perché questa operazione è comunemente considerata una delle sue responsabilità. Inoltre, in alcuni casi, puoi eseguire l'elaborazione parallela, in cui esegui 1 query e inizi a utilizzare i dati restituiti mentre l'altra query è ancora in esecuzione.

    
risposta data 08.11.2018 - 00:24
fonte
4

È meglio recuperare solo ciò che è richiesto dal database piuttosto che recuperare tutto e quindi filtrarlo. Se la tua tabella ha milioni di righe e land e sea hanno solo poche centinaia di righe, la tua query restituirà un milione di righe da iterare.

Quindi la modifica della query del database a WHERE type IN ('land', 'sea') e quindi l'iterazione su di essa sarebbe probabilmente la più efficace.

    
risposta data 07.11.2018 - 23:13
fonte
1

Informazioni sull'opzione 3: emetti una query che restituirà due set di risultati. Qualcosa come:

database.query('SELECT * FROM animals WHERE type="land"; SELECT * FROM animals WHERE type="sea";')

Non so quale lingua stai usando, ma molti di quelli che ho usato possono gestire più set di risultati da una singola query. In questo modo fai in modo che il database faccia ciò che è buono (filtraggio molto veloce) e non devi sostenere il sovraccarico di due connessioni di database separate.

    
risposta data 08.11.2018 - 15:22
fonte

Leggi altre domande sui tag