when we select configure this field is blob and it can be as large as
1k. Is it good practice to get thousands of rows at one time?
Ci sono alcuni livelli in questo. Quando selezioni un grande insieme di righe dal DB, non ti invia un enorme ammasso di byte. Quello che succede è che c'è un cursore sul DB con una dimensione che puoi configurare. Quindi se la dimensione del tuo cursore è di 1000 righe, non prenderà tutte le righe contemporaneamente. Generalmente non dovrai preoccuparti di questo tranne per le cose che citerò più avanti in questa risposta.
Tuttavia, l'altro aspetto di ciò che fai con le righe. Se li inserisci tutti in un elenco sulla tua applicazione (che è ciò che le persone fanno con gli ORM) avrai bisogno di allocare spazio per tutti questi record. Odio questo approccio. È la causa più comune di programmi Java gonfiati. Dovresti davvero eseguire il looping dei record dalla connessione al database come iteratore.
or it is better to make multiple db call?
Ciò dipende dalle considerazioni sulla concorrenza descritte di seguito.
time and space, which is more important?
L'analisi del trade-off del tempo-spazio è qualcosa che si applica quando hai complessità algoritmica. Questo non sembra uno di quei casi. Se tutto quello che stai facendo è leggere una singola riga e scrivere un aggiornamento, usare più memoria non accelera le cose. In effetti, probabilmente rallenterà il tuo programma. Ci vuole tempo per allocare e gestire la memoria. Cerchi di non allocare più memoria del necessario per eseguire l'attività successiva.
users table has millions rows, we need update perhaps 1 column for 1 million
rows. what is a good practice to make this update? is it better to make 1
million db call? or as little db calls as possible?
Suppongo qui che sia necessario esaminare ogni riga e fare un aggiornamento che non può essere fatto semplicemente in un'istruzione SQL one-shot. Non c'è una risposta semplice a questa domanda e questo dipende dal fatto che ci saranno altre applicazioni che interagiscono con queste tabelle mentre stai facendo questo.
Se stai facendo 'select for update', probabilmente non vuoi farlo in un grosso commit. Il motivo per cui lo utilizzi è impedire ad altre applicazioni di modificare i dati tra la selezione e l'aggiornamento. In altre parole, bloccherai tutti questi record per la durata.
Anche se non sei preoccupato per la concorrenza o le letture sporche, probabilmente non vuoi modificare un milione di record e poi impegnarti alla fine perché:
- Se c'è un problema in qualsiasi momento in questo processo, anche se minore, devi ricominciare dall'inizio.
- Scrivere una tonnellata di modifiche non vincolanti in un DB mette un sacco di stress sulle sue risorse.
Quindi c'è un punto debole per le prestazioni per i commit. Tu commetti ognuno e ci sarà un piccolo sovraccarico. Potresti impegnarli in lotti, ma i tuoi tentativi sono un po 'più complicati. Personalmente, a meno che tu non sappia che esiste un problema di prestazioni, probabilmente eseguirò immediatamente ogni cambiamento. È il più facile da ottenere. Un milione di dischi non è poi così tanto al giorno. E 1K non è molti dati. Oracle (ad esempio) non si preoccupa nemmeno di mettere 1K fuori tabella a meno che tu non lo dica.