2011-12-31 6 views
6

Qual è l'opzione più veloce per inserire record nel database: con quale di questi:Inserimento PetaPoco - Metodo più veloce?

  • Database.Insert(poco)
  • Database.Insert(tableName, pkName, poco)
  • Database.Save(poco)
  • Database.Save(tableName, pkName, poco)

Quale dovrei usare per ragioni di prestazione? Uno non è meno conveniente per me rispetto agli altri ...

Grazie.

risposta

10

Quale devo utilizzare per motivi di prestazioni?

I Database.Save metodi recuperare il valore del campo chiave primaria utilizzando GetValue, quindi chiama Database.Insert o Database.Update conseguenza.

Pertanto, è necessario utilizzare solo Database.Save quando il codice ha realmente bisogno di salvare le modifiche su un oggetto che potrebbe essere nuovo o preesistente. Notare inoltre che la tabella deve avere una colonna chiave primaria con incremento automatico per Database.Save per funzionare.

Anche senza la leggera differenza di prestazioni, preferirei la semantica corretta - utilizzando Inserisci o Aggiorna su Salva.

Uno non è meno conveniente per me rispetto agli altri ...

Questo non è proprio vero.

Database.Insert(poco) cerca i valori per tableName e pkName in attributi personalizzati sulla definizione della classe bassa. Se si utilizzano i modelli T4, questi valori verranno mantenuti sincronizzati automaticamente con il database e verranno specificati solo in una posizione. D'altra parte, se li passi in ogni chiamata di metodo, verranno ripetuti innumerevoli volte nella tua base di codice. ASCIUTTO. Cosa succede se è necessario modificare uno dei valori in seguito?

Ora, Database.Insert(poco) sarà leggermente meno performante a causa di tale ricerca.Tuttavia, PetaPoco memorizza nella cache il risultato di tale ricerca in un dizionario statico, quindi l'impatto sulle prestazioni sarà molto piccolo dopo la prima occhiata:

RWLock.EnterReadLock(); 
PocoData pd; 
try 
{ 
    if (m_PocoDatas.TryGetValue(t, out pd)) 
     return pd; 
} 
finally 
{ 
    RWLock.ExitReadLock(); 
} 
+0

Sì, da questa dichiarazione "Uno non è meno conveniente per me rispetto agli altri. .. ", quello che ho fatto per rimediare è stato questo: http://blogs.msmvps.com/bmains/2011/12/31/helpful-petapoco-template-modifications/ Violazione di DRY, sì, ma è meglio per le prestazioni in base a questo: http://www.toptensoftware.com/Articles/94/PetaPoco-More-Speed. Potrei anche provare a fare un passo avanti nella personalizzazione ... –

+0

@BrianMains: hai davvero bisogno di spremere un po 'di velocità in più? Ho lavorato con i modelli SubSonic personalizzati per un po '(li usiamo ancora in un'app che manteniamo) ed è stato un trascinamento. In ogni caso, penso di aver esposto chiaramente i compromessi nella mia risposta. Puoi sicuramente scegliere il percorso più veloce sulla via più facile da mantenere, ma pochi utilizzi ne avrebbero davvero bisogno. I maggiori guadagni saranno da operazioni di dosaggio, istruzioni preparate, indici appropriati, ecc. –

+0

OK, grazie per l'input. –

3

In tutti e 4 i metodi che hai elencato, per gli inserti, sembra che PetaPoco chiama sempre il seguente metodo della classe Database:

public object Insert(string tableName, string primaryKeyName, bool autoIncrement, object poco) 

E il Database.Insert(tableName, pkName, poco) fa la minor quantità di lavoro (è fondamentalmente solo un metodo di passaggio), quindi suppongo che sia quello con le migliori prestazioni.

Qui è il codice per Insert(string, string, object):

public object Insert(string tableName, string primaryKeyName, object poco) 
{ 
    return Insert(tableName, primaryKeyName, true, poco); 
} 

Probabilmente sarebbe un po '(e impercettibile) più veloce per chiamare direttamente il Insert(string, string, bool, object) sovraccarico.