9

将记录插入数据库的最快选项是什么:使用以下哪个:

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

出于性能原因,我应该使用哪一个?一个对我来说并不比另一个更方便......

谢谢。

4

2 回答 2

13

出于性能原因,我应该使用哪一个?

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

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

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

一个对我来说并不比另一个更方便......

这不是真的。

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

现在,Database.Insert(poco)由于该查找,性能会稍微降低。但是,PetaPoco 将该查找的结果缓存在静态字典中,因此第一次查找后对性能的影响将非常小:

RWLock.EnterReadLock();
PocoData pd;
try
{
    if (m_PocoDatas.TryGetValue(t, out pd))
        return pd;
}
finally
{
    RWLock.ExitReadLock();
}
于 2012-01-01T02:27:10.207 回答
3

在您列出的所有 4 个方法中,对于插入,看起来 PetaPoco 总是调用 Database 类的以下方法:

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)直接调用重载可能会稍微(并且不明显)更快。

于 2011-12-31T22:08:08.443 回答