Какова «разумная» продолжительность времени, в течение которого курсор SQL должен оставаться открытым?

StackOverflow https://stackoverflow.com/questions/10727

  •  08-06-2019
  •  | 
  •  

Вопрос

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

и в какой базе?

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

В целом согласен с остальными ответами:По возможности избегайте курсоров (в большинстве случаев) и закрывайте их как можно быстрее.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top