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

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

а по какой базе?

5 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам