Производительность ADO.NET SQL Server: несколько результирующих наборов и несколько команд - PullRequest
3 голосов
/ 10 ноября 2010

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

В псевдокоде что-то вроде

using(new connection)
{
  using (datareader dr = connection.Execute(Command))
  {
    while (dr.NextResult())
    {
      while (dr.Read())
      {
        SomeContainer.Add(Something.Parse(dr));
      }
    }
  }
}

против

using(new connection)
{
  using (datareader dr = connection.Execute(Command))
  {
    while (dr.Read())
    {
      SomeContainer.Add(Something.Parse(dr));
    }
  }

  using (datareader dr = connection.Execute(Command))
  {
    while (dr.Read())
    {
      SomeContainer.Add(Something.Parse(dr));
    }
  }
}

Ответы [ 4 ]

4 голосов
/ 10 ноября 2010

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

Так жевсе, что легче понять, кодировать, отлаживать и поддерживать (имхо, это будет второй вариант).Вы, вероятно, не сможете измерить разницу.

1 голос
/ 10 ноября 2010

Я не согласен, я бы использовал 1-й подход почти всегда (это действительно зависит от конкретного сценария), но в целом лучше иметь процедуру, возвращающую 2 набора результатов, а не 2 вызова для 2 различных процедур,один набор данных точно по причинам, объясненным @Remus (задержка в сети и т. д.).

В большинстве случаев разница не является незначительной.

0 голосов
/ 10 ноября 2010

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

Если вы можете получить все результаты за один вызов, это, естественно, более эффективно, чем несколько вызовов. Рассмотрим простой случай выбора 10 вещей по отдельности вместо выбора всех 10 одновременно с помощью предложения «in». Это 1 запрос, отправленный на сервер, и 1 ответ на анализ против 10 каждого. Об этом говорит Ремус.

Скорее всего, это номинально в сценариях легкого использования, но по мере (если) вы увеличиваете масштаб, болтливость может стать проблемой. Ваш пул подключений имеет предел, который может быть достигнут в определенный момент.

Я бы выбрал вариант 1, если вы возвращаете данные одного типа между вызовами.

Однако, есть также обслуживание и повторное использование. Если вы возвращаете разрозненные данные (т. Е. Извлекаете все данные, необходимые для определенного представления), я бы выбрал вариант 2 и при необходимости оптимизировал бы меньше вызовов.

0 голосов
/ 10 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...