2010-11-22 2 views
3

Я читал, что курсоры довольно slow, и нужно, если только из вариантов не избегать их. Я пытаюсь оптимизировать свои хранимые процедуры, и один из них использует курсор. Он часто вызывается моим приложением и множеством пользователей (20000) и строк для обновления. Я думал, может быть, я должен использовать что-то другое в качестве альтернативы.Насколько медленны курсоры и какие альтернативы лучше?

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

Employee - Id,Name,BenefitId,StartDate,EndDate 

Так на основе benefitId мне нужно сделать различные вычисления, используя даты между StartDate и EndDate и обновления деталей работника. Я просто делаю этот надуманный пример, чтобы дать представление о моей ситуации.

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

ответ

2

Я однажды изменил хранимую процедуру с помощью курсоров, чтобы установить логику. Время работы от 8 часов до 22 секунд. Это различие, о котором мы говорим.

Вместо того, чтобы выполнять разные действия по записи за раз, используйте несколько проходов по данным. Обновите и установите поле1 = A, где поле2 равно X, затем обновите и установите поле1 = B, где поле2 равно Y и т. Д.

1

Курсор обрабатывает строку за строкой или «Row By Agonizing Row», если ваше имя Джефф Моден.

Это всего лишь one example как сделать программирование на основе SQL, в отличие от RBAR, но в конечном итоге это зависит от того, что делает ваш курсор.

Кроме того, посмотрите на это на StackOverflow:

RBAR vs. Set based programming for SQL

-1

Во-первых, это звучит, как вы пытаетесь смешать некоторые бизнес-логики в хранимых проки. Это то, чего вы хотите избежать. Лучшим решением было бы иметь слой среднего уровня, который инкапсулирует эту бизнес-логику. Таким образом, ваш уровень данных остается чисто данным.

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

+1

Многие места требуют, чтобы вся база данных проходила через хранимые процедуры. И лучше всего выполнять сложную обработку в сохраненном proc, который может настроить производительность dba, чем помещать подобные вещи в приложение. Более того, почти все курсоры, запускаемые из приложения, могут быть легко заменены логикой на основе набора. Курсоры редко нужны, за исключением некоторых административных задач, связанных с dba.Если вы вставляете, обновляете или удаляете одну или несколько таблиц, вы можете сделать это на основе набора, почти до 100% времени. – HLGEM 2010-11-22 23:20:17

Смежные вопросы