2011-12-31 9 views
6

データベースにレコードを挿入するための最速のオプションは何である:これらのどれを使用して:ペタポコ挿入 - 最速の方法?

1は、私が使うべき
  • Database.Insert(poco)
  • Database.Insert(tableName, pkName, poco)
  • Database.Save(poco)
  • Database.Save(tableName, pkName, poco)

パフォーマンスの理由? 1つは他のものより私にあまり便利ではありません...

ありがとう。

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

そしてDatabase.Insert(tableName, pkName, poco)は仕事の最低額を行います(これは基本的に次のとおりです。PetaPocoは常にDatabaseクラスの以下のメソッドを呼び出すようにあなたが記載されているすべてのメソッド4では

答えて

10

パフォーマンス上の理由からどちらを使用しますか? Database.Save方法はGetValueを使用して、主キーフィールドの値を取得

、それに応じDatabase.Insert又はDatabase.Updateを呼び出します。

したがって、コードが新しいオブジェクトまたは既存のオブジェクトの変更を実際に保存する必要がある場合は、Database.Saveのみを使用してください。また、テーブルには、Database.Saveの自動インクリメントのプライマリキー列が必要です()。

パフォーマンスのわずかな違いがなくても、私は正しいセマンティクスを使用したいと思います。

一つは本当ではないことを...

他よりも私にはあまり便利ではありません。

Database.Insert(poco)あなたのpocoクラスの定義のカスタム属性でtableNamepkNameの値を探します。 T4テンプレートを使用する場合、これらの値はデータベースと自動的に同期され、1つの場所でのみ指定されます。一方、各メソッド呼び出しでそれらを渡すと、コードベース全体で無数の時​​間繰り返されます。ドライ。後で値の1つを変更する必要がある場合はどうすればよいですか?

今や、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。カスタマイズをさらに進めようとするかもしれません... –

+0

@BrianMains:あなたは本当に余分なスピードを絞る必要がありますか?私はカスタマイズされたSubSonicのテンプレートをしばらく使っていました(私たちが管理しているアプリではまだそれらを使用しています)。いずれにせよ、私は私の答えで明らかにトレードオフをレイアウトしたと思う。あなたは確かにより簡単なルートを維持するために、より速いルートを選択することができますが、実際にはそれを必要とすることはほとんどありません。最大の利益は、バッチ処理、プリペイドド・ステートメント、適切なインデックスなどです。 –

+0

入力いただきありがとうございます。 –

3

は、挿入のために、それが見えますちょうどパススルー方法)、私はそれが最高のパフォーマンスを持つものと仮定します。

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

それはおそらくちょうど直接Insert(string, string, bool, object)オーバーロードを呼び出して、わずかに(とunnoticeably)より高速に次のようになります。ここでは

Insert(string, string, object)ためのコードです。

関連する問題