Являются ли курсоры действительно «правильным» выбором? - PullRequest
0 голосов
/ 13 ноября 2011

Иногда процедурное программирование абсолютно неизбежно при обработке данных.

В настоящее время я работаю над оптимизацией устаревшего кода.Он использует курсор, 63 пары IF / ELSE операторов и BEGIN / END и т. Д. Я надеялся перепроектировать курсор и сделать его процедурным процессом.Теперь я нахожусь в конце декодирования алгоритма, и я понимаю.,,упс ... это имеет процедурный характер, потому что каждый выбор, сделанный в записи, зависит от результата процесса во всех предыдущих записях.

Так что теперь я разорван ...Есть и другие варианты смешивания процедурного кода с обработкой SQL Server (CLR SP, UDF и т. д.).Я большой сторонник использования правильного инструмента для работы, поэтому я склоняюсь к созданию .NET CLR SP для этого.Но было бы быстрее и «проще» просто немного упростить курсор, но все же сохранить курсор.

Что вы все думаете?Теперь, когда у нас есть модули .NET, доступные из-под SQL Server, уместно ли больше использовать курсоры (которые, по моему мнению, были с самого начала «клуджем»).

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

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

с использованием табличной переменной, например, (И этот подход начинает ухудшаться в производительности для очень больших наборов таблиц)

 Declare @Pks Table (pk integer primary key not null)
 Insert @pks(pk)
 Select pkcolName from table where ... [here put logic to 
           extract id values for rows you need to iterate over

 -- then put procedural code here ...
 Declare @pk Integer
 While Exists (Select * From @pks) Begin
     Select @pk = Max(pk) From @pks -- assuming you need to work 
                             -- on pk values from highest to lowest
     // Here do work on one record at a time, using value in @pk
     Delete @pks Where pk = @pk
 End
0 голосов
/ 13 ноября 2011

Я бы просто запустил цикл в C # на сервере клиент / приложение, вызывая хранимые процедуры по мере необходимости.Обычно C # намного быстрее и проще в разработке и модульном тестировании, и он может работать быстрее, чем хранимый процесс, который делает все в базе данных, даже если вы используете CLR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...