2011-11-13 6 views
0

Иногда процессуальное программирование абсолютно неизбежно при обработке данных.Являются ли курсоры действительно «правильным» выбором?

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

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

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

ответ

2

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

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

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

Что вы рекомендуете для итерации процедурно, кроме курсора? И нет, это должно быть процедурным. Я много думал об этом и разорвал его на части, и нет возможности сделать это на основе набора. – richard

+0

Приложение № –

+0

[Я сомневаюсь, что это будет более эффективно, чем использование курсора с указанными правильными параметрами] (http://bradsruminations.blogspot.com/2010/05/truth-about-cursors-part-1. html) –

0

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

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