2011-12-31 53 views
6

什么是插入记录到数据库中最快的选项:使用其中的这些:PetaPoco插页 - 最快的方法?

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

哪一个我应该使用性能的原因?其中一个对我来说比另一个便利...

谢谢。

回答

10

哪一个应该用于性能的原因?

Database.Save方法检索使用GetValue主键字段的值,然后调用Database.InsertDatabase.Update相应。

因此,当您的代码确实需要将更改保存在可能是新的或预先存在的对象时,您应该只使用Database.Save。此外,请注意,您的表必须有一个自动递增的主键列,Database.Save才能正常工作。

即使没有轻微的性能差异,我更喜欢正确的语义 - 使用插入或通过保存更新。

一个并不比其他不太方便,我...

这是不是真的。

Database.Insert(poco)将在您的poco类定义的自定义属性中查找tableNamepkName的值。如果使用T4模板,这些值将自动保持与数据库同步,并且只会在一个位置指定。另一方面,如果你在每个方法调用中传递它们,它们将在整个代码库中重复无数次。干。如果您以后需要更改其中一个值,该怎么办?

现在,由于查找,Database.Insert(poco)的性能会稍差。然而,PetaPoco缓存静态字典中查找的结果,所以对性能的影响将在第一次查询后非常小:

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

是的,这种说法“一个不那么方便我比其他。 ..“,我做了什么补救措施是这样的:http://blogs.msmvps.com/bmains/2011/12/31/helpful-petapoco-template-modifications/违反DRY,是的,但它对性能更好根据这个:http://www.toptensoftware.com/Articles/94/PetaPoco-More-Speed。我可能会尝试让定制更进一步... – 2012-01-01 03:13:07

+0

@BrianMains:你真的需要挤出额外的一点速度吗?我使用了定制的SubSonic模板一段时间(我们仍然在我们维护的应用中使用它们),这是一个拖累。无论如何,我想我已经在我的回答中清楚地阐明了权衡。你当然可以选择更容易维护路线的更快的路线,但很少用法真的需要它。最大收益将来自配料操作,准备好的报表,适当的指数等。 – 2012-01-01 05:13:19

+0

好的,谢谢您的参与。 – 2012-01-01 05:14:56

3

在你列出的方法都4,对于插入,它看起来像PetaPoco总是调用数据库类的以下方法:

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

而且Database.Insert(tableName, pkName, poco)不工作的最低金额(它基本上是只是一种传递方法),所以我会认为它是最好的表现。

这里是Insert(string, string, object)代码:

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

它很可能是轻微(和不易察觉)更快,只是直接调用Insert(string, string, bool, object)超载。