Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Производительность курсоров / 6 сообщений из 6, страница 1 из 1
24.08.2010, 21:32
    #36809195
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность курсоров
ASE 15

Много раз слышал, что курсоры это "зло", потому что сильно тормозят. Но недавно пришлось с этим столкнуться.

Код: plaintext
1.
2.
update my_table
set col1 = '1900.01.01 00:00:00:000'
where col2 =  1 
выполняется 15 сек

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare my_cur cursor for  
select col1 from my_table where col2 =  1   for update

declare @col1 datetime

open my_cur
fetch my_cur into @col1
while @@sqlstatus = 0  
begin 

  update  my_table 
  set col1 = '1900.01.01 00:00:000'
  where current of my_cur
	
  fetch my_cur into @col1
end 
close my_cur 
	 
deallocate cursor my_cur
выполняется 48 сек

Это происходит из-за того, что каждый update в курсоре отдельная транзакция?
Если да, тогда можно ли это обойти как-нибудь?
Например, применить новые фичи ASE 15, такие как delayed commit.
...
Рейтинг: 0 / 0
24.08.2010, 21:40
    #36809208
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность курсоров
А при чем здесь транзакции???
Ты разницу между командами и транзакциями видишь?
...
Рейтинг: 0 / 0
24.08.2010, 22:00
    #36809227
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность курсоров
White Owl,

Транзакции я привел как пример!
Мне не понятна другая вещь. Что является узким местом в производительности у курсора???
...
Рейтинг: 0 / 0
24.08.2010, 23:42
    #36809305
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность курсоров
cherrex_DenТранзакции я привел как пример!Ничего себе пример.

Курсор требует ресурсов. И памяти и процессора.
Отсюда и разница в производительности.
...
Рейтинг: 0 / 0
25.08.2010, 00:03
    #36809320
cherrex_Den
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность курсоров
В принципе здесь вкратце это описано

Ладно, примем тормознутость курсоров как догму

White Owl-у большое спасибо!
...
Рейтинг: 0 / 0
25.08.2010, 12:12
    #36810056
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Производительность курсоров
cherrex_Den wrote:

> Много раз слышал, что курсоры это "зло", потому что сильно тормозят. Но
> недавно пришлось с этим столкнуться.

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

> declare my_cur cursor for
> select col1 from my_table where col2 = *1* for update

Если в курсоре у тебя нет ORDER BY, значит курсор тебе не нужен был.
(исключение: вызов хранимой процедуры для каждой строки курсора.)

> declare @col1 datetime
>
> open my_cur
> fetch my_cur into @col1
> while @@sqlstatus =*0*
> begin
>
> update my_table
> set col1 = '1900.01.01 00:00:000'
> where current of my_cur
>
> fetch my_cur into @col1
> end
> close my_cur
>
> deallocate cursor my_cur

Это можно сделать одним запросом ? Можно. Значит, курсор не нужен.


> Это происходит из-за того, что каждый update в курсоре отдельная транзакция?

это происходить может много изза чего. В том числе и изза того, что
тут N транзакций вместо одной.


> Если да, тогда можно ли это обойти как-нибудь?

Да, конечно, начать одну большую транзакцию и в рамках неё всё
сделать.

> Например, применить новые фичи ASE 15, такие как delayed commit.

О, придумал. Сначала сам всё правильно сделай.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Производительность курсоров / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]