Оптимальный код - один большой запрос, но более сложный поиск данных или множество небольших запросов - PullRequest
0 голосов
/ 10 ноября 2009

У меня есть программа на C #, которая извлекает несколько строк из БД, но в настоящее время делает их по одной на том же соединении.

Было бы лучше написать так, чтобы вместо многократного запуска (где бла меняется каждый раз):

select data from table where name = 'blah'

На что-то вроде:

select name, data from table where name in ('blah','blah2','blah3')

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

Обратите внимание, что данные примера не являются фактическими данными, поэтому я не могу сделать что-то вроде:

select name, data from table where name like 'blah%'

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

Заранее спасибо, Том

Ответы [ 7 ]

2 голосов
/ 10 ноября 2009

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

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

2 голосов
/ 10 ноября 2009

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

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

2 голосов
/ 10 ноября 2009

Одна поездка в БД намного эффективнее, чем несколько маленьких попаданий.

2 голосов
/ 10 ноября 2009

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

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

Параметризованный запрос является быстрым и безопасным. Он кэширует планы запросов и защищает от SQL-инъекций .

SELECT name, data
FROM table
WHERE name in (@name1, @name2, @name3)

В коде вызова вы можете добавлять параметры по мере необходимости. Например (C #):

var command = connection.CreateCommand();
command.CommandText = "SELECT name, data FROM table WHERE name in (";
int index = 0;
string separator = "";
foreach (string value in valueList)
{
   string paramName = "@p" + Convert.ToString(index);
   command.CommandText += separator + paramName;
   command.Parameters.Add(paramName, value);
   separator = ", ";
   index++;
}
command.CommandText += ")";
0 голосов
/ 10 ноября 2009

Одно утверждение лучше, и оптимизировать через базу данных ..

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

Я бы пошел на одну операцию, вызывая

select data from table... etc.etc.

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

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