Quando si utilizza un ORM quando dovrei sacrificare le prestazioni per comodità?

1

Lavoro molto con SQL Alchemy e, in quanto "programmatore pigro", mi piace la comodità che offre. Ma il "programmatore diligente" in me spesso si preoccupa dell'ottimizzazione e delle prestazioni delle query e più le prestazioni della mia applicazione rispetto a quelle query.

Un grave trappola che i programmatori affrontano quando si utilizza un ORM sta svolgendo lavoro nell'applicazione che dovrebbe essere eseguita sul lato del database.

Quindi eccomi qui, a chiedermi quando sacrificare le prestazioni per praticità. Ad esempio, nella mia applicazione potrei spesso dover fare qualcosa del genere:

Comodo

users = User.query.filter_by(some_column=True).all()  # list of User objects (all columns)
refined_users = []
for user in users:  # do something with a couple of columns
    refined_users.append((user.name, user.age))

Ottimizzata

users = session.query(User.name, User.age).filter(User.some_column==True).all()  # list of tuples

Quindi questo è un esempio piuttosto semplice e forzato in cui si opta per l'opzione ottimizzata. Ma nei casi in cui devo interrogare molte colonne , diventa noioso. Mi piace anche la comodità di accedere alle colonne come user.name mentre l'esempio ottimizzato restituisce semplicemente i dati in un elenco di tuple (vale a dire senza nomi di colonne).

Quindi, mentre interrogare l'intero oggetto (cioè: ogni colonna) è conveniente e molto probabilmente non ha che ha un grosso impatto sul mio database, è comunque un po 'sporco sapendo che posso essere più bello al mio database.

    
posta turnip 02.10.2018 - 18:51
fonte

2 risposte

5

Il modo in cui prendi questa decisione è l'ottimizzazione quando è necessario.

Esistono molti scenari (ad esempio un modulo di immissione dei dati a record singolo) in cui il trascinamento di tutti i campi è perfettamente accettabile, dal momento che stai lavorando solo con un singolo record e / o userai la maggior parte o tutti dei campi comunque.

Al contrario, ci sono casi in cui stai tirando solo uno o due campi e non ha senso recuperarli tutti. Il tuo scenario si trova da qualche parte nel mezzo.

In che modo prendi la decisione di ottimizzare?

  1. Identifica un problema di prestazioni effettivo che sta causando un impatto significativo.
  2. Misura il rendimento effettivo, utilizzando un profiler o timer.
  3. Ottimizza quelle aree in cui il miglioramento delle prestazioni supera lo sforzo aggiuntivo richiesto.
risposta data 02.10.2018 - 19:02
fonte
0

La parte lenta di un'operazione del database è il trasferimento dei dati: da disco a memoria e quindi il trasferimento di rete da server a client. Il recupero solo delle colonne selezionate non fa nulla per ridurre il trasferimento da disco a memoria per i database di archiviazione di riga, ma può ridurre i tempi di trasferimento della rete. La differenza sarà maggiore se si recuperano solo poche colonne da righe larghe.

Gli ORM possono produrre query che ottimizzano il confronto o non riescono a sfruttare gli indici esistenti, ma non sta succedendo qui. Non preoccuparti, sii felice.

    
risposta data 02.10.2018 - 19:50
fonte

Leggi altre domande sui tag