О курсорах
От: ppvrt  
Дата: 17.07.09 08:05
Оценка:
В процессе работы использую базы данных MS SQL 2000, 2008.
Пытаюсь ускорить работу курсоров. Для чего использую ключевое слово "fast_forward" при объявлении курсора.
Читал, что есть ещё серверные курсоры. Но что это такое и как их использовать — смутно понимаю.
Что ещё можно сделать для ускорения работы курсоров?
Re: О курсорах
От: MasterZiv СССР  
Дата: 17.07.09 08:26
Оценка: 9 (2) +5
ppvrt пишет:

> Что ещё можно сделать для ускорения работы курсоров?


Самое главное, что можно сделать для ускорения работы курсоров --
это их не использовать.
Posted via RSDN NNTP Server 2.1 beta
Re: О курсорах
От: vmpire Россия  
Дата: 17.07.09 12:02
Оценка:
Здравствуйте, ppvrt, Вы писали:

P>В процессе работы использую базы данных MS SQL 2000, 2008.

P>Пытаюсь ускорить работу курсоров. Для чего использую ключевое слово "fast_forward" при объявлении курсора.
P>Читал, что есть ещё серверные курсоры. Но что это такое и как их использовать — смутно понимаю.
P>Что ещё можно сделать для ускорения работы курсоров?

Лучше всего от курсоров избавляться ибо это зло. Очень часто, если подумать, можно заменить курсор одним запросом.
Если совсем никак — можно заменять их на WHILE.
Если и это никак (в очень специфических случаях), то объявлять их хотя-бы READONLY.
Ещё можно поиграться со словами FORWARD-ONLY и STATIC.

А серверные курсоры — это и есть курсоры, которые Вы используете
Re[2]: О курсорах
От: MasterZiv СССР  
Дата: 18.07.09 11:49
Оценка:
vmpire пишет:

> Лучше всего от курсоров избавляться ибо это зло. Очень часто, если


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

Во всех остальных случах от курсоров надо избавляться.

> Если совсем никак — можно заменять их на WHILE.


На while как раз нет смысла заменять.

> Если и это никак (в очень специфических случаях), то объявлять их

> хотя-бы READONLY.

+1

> Ещё можно поиграться со словами FORWARD-ONLY и STATIC.



+1
Posted via RSDN NNTP Server 2.1 beta
Re[3]: О курсорах
От: MozgC США http://nightcoder.livejournal.com
Дата: 18.07.09 12:31
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>-- необходимость вызвать процедуру для каждой строки таблицы.


Да, это засада. Тут приходится выбирать между быстродействием и дублированием кода, т.к. вместо вызова процедуры с помощью курсора можно переписать запрос без курсора, но тогда будет дублироваться часть кода, который написан в той процедуре.
Re[3]: О курсорах
От: avpavlov  
Дата: 19.07.09 18:20
Оценка:
MZ>-- наличие алгоритма, обрабатывающего данные в определённом порядке,
MZ>строка за строкой.

Помнится как то обсуждали, что некоторые алгоритмы, требующие обработку в определённом порядке, всё-таки можно переписать без курсоров

MZ>-- необходимость вызвать процедуру для каждой строки таблицы.


Начиная с МССКЛ 2005 есть операторы outer apply/cross apply, которые данный класс задач могут решить без курсоров (хотя вероятно и не все)
Re[4]: О курсорах
От: _d_m_  
Дата: 21.07.09 04:26
Оценка:
Здравствуйте, avpavlov, Вы писали:

MZ>>-- необходимость вызвать процедуру для каждой строки таблицы.


A>Начиная с МССКЛ 2005 есть операторы outer apply/cross apply, которые данный класс задач могут решить без курсоров (хотя вероятно и не все)


апли конечно мощная вещь, но обычно не помогает. Если вызывается процедура — то для какой-то доп обработки с использованием update/insert/delete/raiserror — апли здесь не поможет.
Re: О курсорах
От: Ellin Россия www.rsdn.ru
Дата: 22.07.09 12:16
Оценка:
Здравствуйте, ppvrt, Вы писали:
Еще можно попробовать асинхронные курсоры. Но это зависит от задачи...
Re[3]: О курсорах
От: Аноним  
Дата: 23.07.09 05:41
Оценка:
>> Если совсем никак — можно заменять их на WHILE.
MZ>На while как раз нет смысла заменять.

А что на MS-SQL появилась новая возможность проходить по курсору, кроме как
WHILE @@FETCH_STATUS = 0 ?
Или что вы обсуждаете?

У меня на практике были ситуации когда из сложного запроса (десятки JOINов)
курсор сильно тормозил, переписываешь во временную таблицу, проходишь по ней — не тормозит.
Какие опции использовал уже не помню ...
Re[4]: О курсорах
От: MasterZiv СССР  
Дата: 23.07.09 05:45
Оценка:
Аноним 1 wrote:
> А что на MS-SQL появилась новая возможность проходить по курсору, кроме как
> WHILE @@FETCH_STATUS = 0 ?
> Или что вы обсуждаете?

Я полагал, что имелось в виду что-то типа

set rowcount 100

while 1=1
begin
update theTable set ... where ...
if @@rowcount = 0
break
end

других альтернатив курсору с while я не знаю.

> У меня на практике были ситуации когда из сложного запроса (десятки JOINов)

> курсор сильно тормозил, переписываешь во временную таблицу, проходишь по
> ней — не тормозит.

Фантастика.
Posted via RSDN NNTP Server 2.1 beta
Re[5]: О курсорах
От: Goodkov Россия  
Дата: 23.07.09 06:15
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> У меня на практике были ситуации когда из сложного запроса (десятки JOINов)

>> курсор сильно тормозил, переписываешь во временную таблицу, проходишь по
>> ней — не тормозит.

MZ>Фантастика.


Ничего и не фантастика. Я конечно не знаю ситуацию у автора сообщения, но прокрутка
курсора, основанного на очень тяжелых запросах и объявленного без кляузы STATIC или
INSENSITIVE(ISO), очень даже может тормозить.
Re[4]: О курсорах
От: _d_m_  
Дата: 23.07.09 06:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>У меня на практике были ситуации когда из сложного запроса (десятки JOINов)

А>курсор сильно тормозил, переписываешь во временную таблицу, проходишь по ней — не тормозит.
А>Какие опции использовал уже не помню ...

А вот зря. А то бы как раз оказалось, что использовал ты динамческий обновляемый курсор. И оказалось бы, что оператор select в курсоре имел отвратительный план запроса. А так глядишь объявил курсор хотя-бы так и все получилось бы:
declare cur cursor local fast_forward
    for select ...
Re[6]: О курсорах
От: MasterZiv СССР  
Дата: 23.07.09 15:56
Оценка:
Goodkov пишет:

> MZ>Фантастика.

>
> Ничего и не фантастика. Я конечно не знаю ситуацию у автора сообщения,

Я восхищался, восхищался.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.