Код C # и сравнение производительности хранимых процедур SQL Server 2008 - PullRequest
1 голос
/ 18 марта 2012

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

Я нажимаю все минутные бары для каждого инструмента в одной общей таблице, где первичный ключ - 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. Если я сделаю простое выражение Select из кода C #, чтобы получить все данные за 900 минут, а затем зациклюсь и создаю 180 данных с 5-минутным баром в моем коде C #, и на каждом 5-минутном баре получаю цену открытия, высокую цену , цена закрытия, объем.

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

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

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

Ответы [ 2 ]

5 голосов
/ 18 марта 2012

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

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

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

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

3 голосов
/ 18 марта 2012
  • Решение хранимой процедуры быстрее.Хотя бы потому, что нет необходимости передавать все необходимые данные между сервером sql и приложением c #;
  • Но хранимая процедура менее надежна и, как мне кажется, ее сложно поддерживать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...