2012-03-18 5 views
1

Я разрабатываю высокочастотное торговое приложение с использованием C#, платформы .NET 3.5 и SQL Server 2008 R2. Я подписываюсь на 70 инструментов, для каждого инструмента я храню 1 минуту баров. Каждый стержень для каждого инструмента состоит из Open Price, High Price, Low Price, Close Price, Volume.C# код и сравнение производительности хранимых процедур SQL Server 2008

Я нажимаю все одноминутные бары для каждого инструмента в одной общей таблице, где первичный ключ StockID.

Теперь для некоторых расчетов. Мне нужно будет построить 5-минутные бары, 10-минутные бары, 15-минутные бары и т. Д. С 1-минутных баров. Пример: я буду зацикливаться на последних 5 строках с 1 минутами и построить 1-й бар с размером бара = 5 мин. И в течение этого 5-минутного бара мне нужно будет найти Open Price, High Price, Low Price, Close Price, Volume. Точно так же мне понадобятся 180, 5 мин. Баров. Итак, мне понадобится 180 * 5 = 900 рядов 1 мин. Баров. (От 900, я построю 180 строк каждый 5 минут)

  1. Если я сделать простое Выбрать заявление от C# код, чтобы получить все 900 один минутные данные, а затем цикл и создать 180 данных с 5 мин бара в мой код C# и в каждом 5-минутном баре получают открытую цену, высокую цену, цену закрытия, объем.

  2. Или, я пишу SQL-хранимую процедуру, чтобы сделать то же самое выше и вернуть открытую цену, высокую цену, низкую цену, цену закрытия, объемы для всех 180 данных с 5-минутными барами до кода C#.

Мой вопрос, который будет намного быстрее 1) или 2) и которая будет более надежной 1) или 2)

Надежды, я обрамление моего вопроса и сценария подробно для экспертов веди меня.

+1

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

+1

Другой вопрос «измерьте сами». По крайней мере, вы спрашиваете о ремонтопригодности. – Marc

+0

Это зависит от многих переменных - скорости клиента, скорости сервера, латентности сети, количества данных, индексов, качества s'proc. Тебе нужно проверить это самостоятельно. – Phil

ответ

5

Вы думаете о терминах «петли». В реляционной базе данных вы должны думать о терминах «множеств». Работа с циклами в хранимой процедуре часто выполняется с помощью курсоров. Он медленный (как в 50-100 раз медленнее, чем рабочий набор), а механизм блокировки, связанный с курсорами, может блокировать другие процессы. Вот почему вы всегда должны избегать их использования.

Самое быстрое решение работает с хранимой процедурой. Об этом не может быть и речи. Самое большое различие заключается в том, что он отключает весь сетевой трафик. SP запускается непосредственно в базе данных, нет сетевого трафика. Отладка их может быть болью, но я слышал, что Visual Studio 2010 предлагает некоторые улучшения.

Следующая вещь, о которой вы должны подумать, - это КАК реализовать хранимую процедуру: вы можете использовать медленный метод блокировки петель и курсоров или быстро ориентированный путь.

На основе вашего описания вы можете получить много в исполнении, сохранив некоторые данные в двух таблицах: одна ваша обычная таблица со всеми данными, а другая - «оконный стол», в которой хранятся только те данные, которые вам нужны для заполнения этих 5 минут, 10 минут и 15 минут, ... баров. Если вы можете создать 15-минутную полосу с данными трех последних 5-минутных баров, затем сохраните эти 3 последних 5-минутных бара в оконном столе, когда приходят 4-я 5-минутные бары, выбивают старейший 5-минутный бар и вставляют новый 5-минутный бар. Когда вы можете создать новую 30-минутную панель на основе последних 2 15-минутных баров, затем сохраните эти 2 15-минутных бара, ... Постарайтесь, чтобы этот оконный вклад был как можно меньше, поэтому он может хранить в памяти все время.

3
  • Решение хранимой процедуры выполняется быстрее. По крайней мере, потому что нет необходимости передавать все необходимые данные между сервером sql и C# app;
  • Но, хранимая процедура менее реста и очень трудно поддерживать, я думаю.
Смежные вопросы