2011-12-31 11 views
6

¿Cuál es la opción más rápida para insertar registros en la base de datos: usando cuáles de éstos:Insertar PetaPoco: ¿el método más rápido?

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

¿Cuál debo utilizar para razones de rendimiento? Uno no es menos conveniente para mí que el otro ...

Gracias.

Respuesta

10

¿Cuál debería usar por motivos de rendimiento?

Los métodos Database.Save recuperar el valor del campo clave primaria utilizando GetValue, a continuación, llama Database.Insert o Database.Update en consecuencia.

Por lo tanto, solo debe usar Database.Save cuando su código realmente necesite guardar cambios en un objeto que podría ser nuevo o preexistente. Además, tenga en cuenta que su tabla debe tener una columna de clave principal de incremento automático para que funcione Database.Save.

Incluso sin la ligera diferencia de rendimiento, preferiría la semántica correcta, utilizando Insertar o Actualizar sobre Guardar.

Uno no es menos conveniente para mí que el otro ...

Eso no es realmente cierto.

Database.Insert(poco) buscará valores para tableName y pkName en atributos personalizados en la definición de su clase baja. Si usa las plantillas T4, estos valores se mantendrán sincronizados con su base de datos automáticamente, y solo se especificarán en una ubicación. Por otro lado, si los pasa en cada llamada a un método, se repetirán innumerables veces a lo largo de su código base. SECO. ¿Qué sucede si necesita cambiar uno de los valores más adelante?

Ahora, Database.Insert(poco) será un rendimiento ligeramente menor debido a esa búsqueda.Sin embargo, PetaPoco almacena en caché el resultado de que las operaciones de búsqueda en un diccionario estático, por lo que el impacto en el rendimiento será muy pequeño después de la primera búsqueda:

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

Sí, por esta declaración "Uno no es menos conveniente para mí que el otro. .. ", lo que hice para remediarlo fue esto: http://blogs.msmvps.com/bmains/2011/12/31/helpful-petapoco-template-modifications/ Violación de DRY, sí, pero es mejor para el rendimiento de acuerdo con esto: http://www.toptensoftware.com/Articles/94/PetaPoco-More-Speed. También podría intentar llevar la personalización un paso más allá ... –

+0

@BrianMains: ¿Realmente necesitas exprimir un poco más de velocidad? Trabajé con plantillas de SubSonic personalizadas por un tiempo (todavía las usamos en una aplicación que mantenemos), y fue un arrastre. En cualquier caso, creo que he expuesto las compensaciones claramente en mi respuesta. Sin duda, puede elegir la ruta más rápida sobre la ruta más fácil de mantener, pero pocos usos realmente lo necesitarían. Las mayores ganancias se obtendrán de las operaciones de procesamiento por lotes, las declaraciones preparadas, los índices adecuados, etc. –

+0

OK, gracias por la entrada. –

3

En todos los 4 de los métodos que se indican, por inserciones, parece que PetaPoco llama siempre el siguiente método de la clase de base de datos:

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

Y el Database.Insert(tableName, pkName, poco) hace la menor cantidad de trabajo (que es básicamente solo un método de paso), así que supongo que es el que tiene el mejor rendimiento.

Este es el código para Insert(string, string, object):

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

Probablemente sería ligeramente (e imperceptible) más rápido que llame a la sobrecarga de Insert(string, string, bool, object) directamente.

Cuestiones relacionadas