PetaPoco Insert - самый быстрый метод? - PullRequest
6 голосов
/ 31 декабря 2011

Какой самый быстрый вариант для вставки записей в базу данных: с помощью какого из них:

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

Какой из них мне следует использовать из соображений производительности? Одно не менее удобно для меня, чем другое ...

Спасибо.

Ответы [ 2 ]

10 голосов
/ 01 января 2012

Какой из них мне следует использовать из соображений производительности?

Методы Database.Save извлекают значение поля первичного ключа, используя GetValue, затем вызывают Database.Insert или Database.Update соответственно.

Следовательно, вы должны использовать Database.Save только в том случае, если вашему коду действительно нужно сохранить изменения в объекте, который может быть как новым, так и уже существующим. Также обратите внимание, что ваша таблица должна иметь автоинкрементный столбец первичного ключа, чтобы Database.Save работал.

Даже без небольшой разницы в производительности, я бы предпочел правильную семантику - использовать вставку или обновление вместо сохранения.

Один не менее удобен для меня, чем другой ...

Это не совсем так.

Database.Insert(poco) будет искать значения для tableName и pkName в пользовательских атрибутах определения вашего класса poco. Если вы используете шаблоны T4, эти значения будут автоматически синхронизироваться с вашей базой данных, и они будут указаны только в одном месте. С другой стороны, если вы передадите их в каждом вызове метода, они будут повторяться бесчисленное количество раз по всей вашей кодовой базе. DRY. Что если вам нужно изменить одно из значений позже?

Теперь, Database.Insert(poco) будет немного менее производительным из-за этого поиска. Тем не менее, PetaPoco кэширует результат этого поиска в статическом словаре, поэтому влияние на производительность будет очень незначительным после первого поиска:

RWLock.EnterReadLock();
PocoData pd;
try
{
    if (m_PocoDatas.TryGetValue(t, out pd))
        return pd;
}
finally
{
    RWLock.ExitReadLock();
}
3 голосов
/ 01 января 2012

Во всех 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) напрямую.

...