ADO.NET Вызов хранимой процедуры эффективно - PullRequest
0 голосов
/ 03 мая 2018

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

Я хочу добиться этого без существенного снижения производительности, однако я не уверен, как лучше всего подойти к этой проблеме.

Вот мой код (максимально упрощенный)

* Примечание. Я использую таблицу данных, поскольку одним из параметров, используемых хранимой процедурой, является пользовательский Определяемый пользователем тип таблицы из БД.

public class DBWorker
{
    public void Update(IEnumerable<UpdateModel> updates)
    {
        using (SqlConnection connection = new SqlConnection(this._connectionString))
        using (SqlCommand command = new SqlCommand(this._storedProcedureString, connection) { CommandType = CommandType.StoredProcedure })
        {
            foreach (var update in updates)
            {
                command.Parameters.Add("@EntryID", SqlDbType.Int).Value = update.EntryID;
                command.Parameters.Add("@Type", SqlDbType.Int).Value = update.Type;

                DataTable dataTable = new DataTable();
                dataTable.Columns.Add("ParamID");
                dataTable.Columns.Add("Value");
                DataRow row = dataTable.NewRow();
                row["ParamID"] = update.ParamID;
                row["Value"] = update.Value;
                dataTable.Rows.Add(row);

                command.Parameters.Add("@NameValues", SqlDbType.Structured).Value = dataTable;
                command.ExecuteNonQuery();
            }
        }
    }
}

public class UpdateModel
{
    public int EntryID { get; set; }

    public int Type { get; set; }

    public int ParamID { get; set; }

    public string Value { get; set; }
}

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

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

Не уверен, имеет ли это значение, но это структура таблицы, которую фактически обновляет SP:

  • ID - int, личность, PK
  • EntryID - int, notnull
  • Тип - int, notnull
  • ParamID - int, notnull
  • Значение - varchar, notnull

1 Ответ

0 голосов
/ 03 мая 2018

Вы идете по правильной дороге здесь, но ...

  1. Вы создаете таблицу данных, добавляете одну строку и передаете таблицу данных в хранимую процедуру. Для каждой UpdateModel. Лучше создать строку для обновления (со всеми четырьмя столбцами - из свойств вашего объекта обновления), а затем передать таблицу данных (теперь со многими строками) в SP.
  2. Подумайте о том, что происходит с этой командой, в частности о том, какие параметры вы можете добавлять (учитывая, что вы добавляете параметры каждый раз, когда проходите цикл).
  3. Дайте столбцам в таблице данных какой-то явный тип данных

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

...