2013-10-11 3 views
-3

Как я могу получить максимальную производительность? Я всегда использую расчет в клиентском приложении, чем в процедурах. Я получил таблицу размером около 10 000 строк для оценки. База данных находится на веб-сервере хостинга, и я читал все строки и показывал в datagrid в своем приложении.Как я могу получить самую быструю работу на клиентской системе?

Таким образом, на моем пути, считывая столбцы «ProductPrice» и «ProductQty», я могу вычислить ProductPrice * Qty и сохранить его в другом столбце в приложении, учитывая меньшее количество данных, которые будут переданы.

Какое из следующего было бы быстрее?

SqlCommand sqlCmdTxt = new SqlCommand(conn); 
SqlDataReader sqlRead; 

sqlCmdTxt.commandText = "Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock"; 
sqlRead = sqlCmdTxt.ExecuteReader(); 
while (
sqlRead.Read()) { 
    double price = sqlRead.GetDouble(0); 
    double qty = sqlRead.GetDouble(1); 
    double sum = price * qty; 

    dataGridView.rows.add (new object[] {price, qty, sum}); 
} 

или

SqlCommand sqlCmdTxt = new SqlCommand(conn); 
DataSet dSet = new DataSet(); 
new SqlDataAdapter(new SqlCommand("Select ProductPrice, ProductQty, ProductPrice * ProductQty As Total From Stock" 
    , conn)).Fill(dSet, "StockList"); 
dataGridView.DataSource = dSet.Tables["StockList"].DefaultView; 
+3

вы можете использовать секундомер, чтобы оценить его. Почему так? –

+0

Я предполагаю, что никакой существенной разницы не будет. Тем не менее, я бы предпочел включить вычисление в код C# –

+1

Нет, я нашел abt 20 секунд разницы btwn этих двух. Так что просто подумайте, если в случае 5 миллионов строк или что-то в этом роде. Что происходит? – Sayka

ответ

6

Само вычисление, вероятно, будет незначительным (выполняется на сервере или клиенте). Наиболее существенным является получение физических данных (план выполнения запросов, кэширование, кластеризация, разбиение на разделы и т. Д.) И передача этих данных с сервера на клиент.

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

Однако, если у вас ...

Select ProductPrice, ProductQty From Stock 

... против ...

Select ProductPrice * ProductQty As Total From Stock 

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

И если вы когда-нибудь нужно фильтровать данные в любом случае, с помощью серверного WHERE, вероятно, будет гораздо быстрее, чем выборка всех строк клиенту просто отбросить большинство строк там.Если вы заинтересованы в теме производительности базы данных, я горячо рекомендую взглянуть на: Use The Index, Luke!

Рекомендации:

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

Или агрегат (SUM, AVG, MAX ...) или JOIN и т.д ...

3

Мое мнение, чтобы сделать все расчеты на сервере - это, безусловно, быстрее.

Если вы используете медленную машину для SQL Server, вы можете получить хуже результаты на сервере. В случае, когда вы запускаете его на одном компьютере, я предпочитаю использовать SQL Server.

+0

От вашего дела зависит от того, что вы будете делать. Если вы повторяете результаты в C#, чем beter, чтобы делать вычисления из кода C#, потому что вы должны их итерации в любом случае, и один расчет не будет отличаться от времени. Но если вы привязываете свои данные к некоторой сетке, чем лучше вычислять из sql. –

+1

@KalanjDjordjeDjordje, есть ли у вас какие-либо ссылки на это или это просто ваше мнение? Нет лучшей практики дефакто. Это всегда зависит от ряда факторов. – Jodrell

0

Возможно, что ваш код на C# будет быстрее, поскольку для перевода между механизмом SQL и вашим приложением меньше данных. С 50K строк это не очень важно, но с гораздо большими рядами & Таблицы, сохраняющие стоимость передачи, которая может быть в медленной сети, могут иметь существенное значение.

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

+0

@Sayka Производительность не может быть «добавлена ​​позже», вы должны запланировать ее заранее. Даже если у вас нет сети между сервером и клиентом, по-прежнему существует «стоимость перевода» (возможно, межпроцессная связь, в зависимости от СУБД), а аспект «физического извлечения» не изменяется в любом случае. Если вы всегда извлекаете целые таблицы, не может быть существенной разницы, но тогда вы не используете базу данных, поскольку она должна использоваться. –

+1

@Sayka BTW, если вам нужна только локальная база данных, возможно, SQL Server не должен быть вашим первым выбором? Рассмотрим встроенную базу данных, такую ​​как SQL Server Compact Edition или SQLite. –

1

Вообще хранимая процедура лучше - не только абстрактная лежащая в основе БД схемы от клиента (давая вам больше API-подход к уровню данных), но он позволяет SQL Engine манипулировать данными и возвращать только результат для вас.

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

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

Смежные вопросы