Какой «разумный» промежуток времени, чтобы держать курсор SQL открытым? - PullRequest
3 голосов
/ 14 августа 2008

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

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

Ответы [ 5 ]

8 голосов
/ 14 августа 2008

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

5 голосов
/ 14 августа 2008

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

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

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

2 голосов
/ 14 августа 2008

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

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

2 голосов
/ 14 августа 2008

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

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

2 голосов
/ 14 августа 2008

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

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

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