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