Некоторые альтернативы использованию курсора:
Циклы WHILE Temp tablolar Производные таблицы Связанные подзапросы Операторы CASE Множественные запросы Часто операции с курсором также могут выполняться без использования курсора.
Если вы уверены, что курсор необходимо использовать, количество обрабатываемых записей следует максимально сократить. Один из способов сделать это - сначала обработать записи во временной таблице, а не в исходной таблице, а в курсоре, который будет использовать записи во временной таблице. При использовании этого пути предполагается, что количество записей во временной таблице значительно уменьшено по сравнению с исходной таблицей. С меньшим количеством записей курсор завершается быстрее.
Некоторые свойства курсора, влияющие на производительность, включают:
FORWARD_ONLY: поддерживает пересылку только курсора из первой строки в конец с помощью FETCH NEXT. Если не задано значение KEYSET или STATIC, предложение SELECT повторно оценивается при вызове каждой выборки.
СТАТИЧЕСКИЙ: Создает временную копию созданных данных и используется курсором. Это предотвращает пересчет курсора при каждом его вызове, что повышает производительность. Это не позволяет изменять тип курсора, и изменения в таблице не отражаются при вызове выборки.
KEYSET: строки с курсором помещаются в таблицу в базе данных tempdb, и изменения неключевых столбцов отражаются при вызове выборки. Однако новые записи, добавленные в таблицу, не отображаются. С курсором набора ключей оператор SELECT больше не вычисляется.
ДИНАМИЧНЫЙ: все изменения в таблице отражаются в курсоре. Курсор повторно оценивается при каждом вызове выборки. Он использует много ресурсов и отрицательно сказывается на производительности.
FAST_FORWARD: курсор односторонний, например FORWARD_ONLY, но указывает, что курсор доступен только для чтения. FORWARD_ONLY - это повышение производительности, и курсор не переоценивается при каждой выборке. Он дает лучшую производительность, если подходит для программирования.
ОПТИМИСТИЧЕСКИЙ: этот параметр можно использовать для обновления строк в курсоре. Если строка выбирается и обновляется, а другая строка обновляется между операциями выборки и обновления, операция обновления курсора завершается ошибкой. Если используется OPTIMISTIC курсор, который может выполнять обновление строки, он не должен обновляться другим процессом.
ПРИМЕЧАНИЕ. Если cursore не указан, по умолчанию используется FORWARD_ONLY.
person
Burak Kartal
schedule
12.07.2018