Что такое «разумный» промежуток времени, чтобы держать курсор SQL открытым?

Что такое «долгое время», чтобы держать транзакцию открытой перед фиксацией или откатом? Минуты? Секунды? Часы?

и на какой базе данных?

14.08.2008 06:07:53
5 ОТВЕТОВ
РЕШЕНИЕ

@lomaxx, @ChanChan: насколько мне известно, курсоры - это проблема только SQL Server и Sybase (варианты T-SQL). Если ваша база данных - Oracle, то курсоры - ваш друг. Я видел несколько случаев, когда использование курсоров фактически улучшало производительность. Курсоры - невероятно полезный механизм, и говорить, что такие вещи, как «если вы используете курсор, мы вас увольняем», немного смешно.

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

2
14.08.2008 08:59:38

транзакции: минуты.

Курсоры: максимум 0 секунд, если вы используете курсор, мы вас увольняем.

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

5
15.08.2008 17:43:52
Похоже, ваша проблема в том, что вы используете SQLServer.
Crashworks 13.02.2009 00:56:20

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

8
14.08.2008 06:10:46

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

Однако: все зависит от среды, в которой вы работаете.

  • Если это рабочая среда веб-сайта с большим количеством пользователей, убедитесь, что курсор исчезает, прежде чем кто-то получит тайм-аут.
  • Если вы, например, пишете «журнал, анализирующий хранимую процедуру» (или что-то еще) на частной машине, которая больше ничего не делает: не стесняйтесь делать все, что вы хотите. Вы будете единственным человеком, который должен ждать. Дело не в том, что сервер базы данных умрет, потому что вы используете курсоры. Однако следует учитывать, что, возможно, поведение пользователей со временем изменится, и в какой-то момент это приложение может использовать 10 человек. Так что попробуйте найти другой путь;)
2
14.08.2008 07:34:12

@ninesided: кроме проблем с производительностью, речь идет также об использовании правильного инструмента для работы. Если бы вы решили переместить курсор из вашего запроса в код, я бы подумал, что 99 раз из 100 было бы лучше поместить эту логику зацикливания в некоторый вид управляемого кода. Это позволяет вам использовать преимущества отладчика, проверки ошибок времени компиляции, безопасности типов и т. Д.

Мой ответ на вопрос остается прежним, если вы используете курсор, закройте его как можно скорее, в оракуле я бы также попытался использовать явные курсоры.

2
14.08.2008 13:05:04