2011-12-31 51 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)超載。