SQL Server MS - Когда КУРСОР хорош?

Azure Microsoft Windows могла бы быть стоящей рассмотрения. Я боюсь, что не использовал его, так не может сказать, хорошо работает ли это, и необходимо принять во внимание, что это - CTP в данный момент.

Проверка это здесь.

39
задан OMG Ponies 26 September 2009 в 20:37
поделиться

8 ответов

Обычно их следует избегать, но для этой функции есть причина, и иногда их можно использовать. Я бы сказал, что 90 +% курсоров, которые я видел, не нужны. Если вы используете их для операций CRUD, это почти всегда можно переделать на основе набора. Я часто видел, как люди используют для этого курсоры, потому что они не знают, как использовать объединения при обновлении или удалении или что они могут использовать статус выбора вместо предложения значений во вставке. Еще одно ненужное использование, когда люди думают, что они нужны им для немного более сложной обработки, которая на самом деле может быть легко обработана с помощью оператора case.

Курсоры иногда быстрее вычисляют что-то вроде промежуточной суммы.

Курсоры также удобны для множественного выполнения. хранимой процедуры, которая настроена для обработки только одного входного значения за раз. Я не использую эту функцию для запуска процессов, сохраненных пользователем (если я не знаю, что попаду в очень небольшой набор данных), но это очень удобно для администраторов баз данных, когда им нужно запускать системные процессы для нескольких таблиц.

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

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

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

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

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

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

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

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

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

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

36
ответ дан 27 November 2019 в 02:48
поделиться

Однажды я спросил одного человека из команды SQL Server, не могли бы вы добавить одну функцию, которая сделала бы продукт лучше для всех, что бы это было?

Его ответ был: «Добавить? Ха, я бы забрал одну. Если вы избавитесь от курсоров, вы заставите программистов во всем мире думать о вещах в стиле SET, и это будет самым большим в мире увеличением производительности БД, которое вы когда-либо видели ».

Со своей стороны, однако я склонен Чтобы увидеть шаблон, кажется, что существует множество процедурных кодировщиков, которые используют курсоры, потому что им нужно иметь возможность выполнять операцию по одному элементу за раз и пропускать старую моду концепцию цикла WHILE. Та же основная идея без накладных расходов курсора. Все еще не так быстро / эффективно, как что-то на основе SET, но в 90% случаев, когда кто-то заявляет: «Я не могу сделать этот набор на основе,

8
ответ дан 27 November 2019 в 02:48
поделиться

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

1
ответ дан 27 November 2019 в 02:48
поделиться

В руководстве по подготовке к MCTS для SQL Server 2008, которое я изучаю, рекомендуется использовать внешний код CLR везде, где в T-SQL потребуется КУРСОР, особенно теперь, когда SQL Server 2008 поддерживает настраиваемые агрегатные функции .

5 лет назад я работал с ними над расширенными функциями отчетности, но я не думаю, что смог бы придумать для них хороший вариант использования сейчас. Агрегаты и функции CLR работают аналогично встроенным агрегатным функциям.

1
ответ дан 27 November 2019 в 02:48
поделиться

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

Например, резервное копирование базы данных, проверка целостности, восстановление индексов. Короче говоря, административные задачи.

1
ответ дан 27 November 2019 в 02:48
поделиться

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

0
ответ дан 27 November 2019 в 02:48
поделиться

You use cursor for rebuilding or reorganizing table indexes individually
unless there is a way of running ALTER INDEX... as a set-based operation.

0
ответ дан 27 November 2019 в 02:48
поделиться

Курсоры полезны, когда 1) вам нужно сделать что-то, чего нельзя сделать с помощью операции набора, или 2) нет смысла выполнять ту же работу, выполняя итеративные вызовы из прикладной уровень. Или иногда у вас есть процедура, которая должна оставаться на уровне базы данных, и вы просто не можете вернуться к промежуточному потоку уровня приложения для итерации по некоторому набору результатов.

Одна рекомендация, которую я бы сделал, заключается в том, что люди используют курсор вместо обычных курсоров, потому что вы избегаете проблем с выделением / освобождением курсора, которые окружают обычные курсоры. С обычным курсором, если вы не освободите их, они сохранятся, что может быть источником утечек памяти. Иначе обстоит дело с курсорами на основе переменных (например, DECLARE @cursor CURSOR).

Суть в том, что избегайте их, если можете, а если не можете,

0
ответ дан 27 November 2019 в 02:48
поделиться