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)pocoクラスの定義でカスタム属性の値を検索しますtableNamepkNameT4テンプレートを使用する場合、これらの値はデータベースと自動的に同期され、1つの場所でのみ指定されます。一方、各メソッド呼び出しでそれらを渡すと、コードベース全体で無数に繰り返されます。ドライ。後で値の1つを変更する必要がある場合はどうなりますか?

これで、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 に答える