Улучшить производительность обновления SQL-запросов - PullRequest
0 голосов
/ 29 марта 2011

У меня есть база данных SQL, содержащая бирки, загруженные с Yahoo !.Я пытаюсь создать некоторые индикаторы для анализа этих акций (например, простая скользящая средняя).Я обеспокоен производительностью моего запроса, который просто UPDATE @stockname SET SMA = @value WHERE id = @n.Обновление 2000 строк занимает 2 минуты.Я пытался с хранимой процедурой, но результат почти тот же.

for (int i = 0; i < closing_prices.Count - length; i++)
{
   double signalValue signalValue = Selector.SignalProcessor(Signal,
                                        closing_prices.GetRange(i, length), length);
    //Write the value into the database
    string location = Convert.ToString(i + length + 1);
    this.UpdateWithSingleCondition("_" + Instrument, columnName,
         signalValue.ToString(), "id", location, "=", sql_Connection);
}

Этот цикл вызывает хранимую процедуру для обновления столбца SMA каждый раз, когда генерируется новое значение.Есть ли возможность поместить непосредственно весь столбец в базу данных?Я думаю, что это может сэкономить время.В любом случае, обновление 500 строк за 2 минуты звучит очень медленно.

Не могли бы вы рассказать, как улучшить время выполнения моего запроса?

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Анализ вашей производительности. У тебя должно быть НЕКОТОРОЕ узкое место. Ваш счет обновления очень низок. Вы легко сможете делать 10-30 обновлений в секунду, что за 2 минуты приведет к гораздо большему количеству обновлений .... и это на стандартном компьютере, а не на одной, имеющей базу данных (что означало бы много быстрых дисков).

Проведите анализ производительности на сервере sql и выясните свои узкие места. У вас есть все необходимые индексы?

1 голос
/ 29 марта 2011

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

0 голосов
/ 31 марта 2011

Я бы создал хранимый процесс, который получает строку.Эта строка представляет собой строку XML или разделенную строку.

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

и преобразовать строку во временную таблицу.

Затем выполните вставку из временной таблицы в таблицу назначения.

Таким образом, вы делаете один вызов серверу БД и избегаете разговоров.Это намного быстрее, чем несколько вызовов.

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

0 голосов
/ 29 марта 2011

Сначала отключите ограничения внешнего ключа.затем включите их снова:

Чтобы отключить «ALTER TABLE» «С NOCHECK CONSTRAINT ALL»

Чтобы включить их, используйте «ALTER TABLE» вместе с «WITH CHECK CONSTRAINT ALL».

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