Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 UPDATE WHERE CURRENT OF vs UPDATE  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Тут возник практический вопрос, что удобнее в использовании и быстрее в работе обычное обновление записи или тоже самое сделанное через курсор, если курсор все равно используется?

Задача состоит в периодичесом начислении клиентам сумм за пользование различными услугами. Решаем примерно так:
Процедура
Курсор1 по клиентам - либо PK, либо все нужные в расчете поля ?
Процедура- параметер курсор или нужные поля в параметрах ?
Курсор2 по услугам клиента - либо PK, либо все нужные в расчете поля ?
Процедура- параметер курсор или нужные поля в параметрах ?
расчет и обновление курсора2 - либо WHERE CURRENT OF, либо UPDATE ?
обновление курсора1 - либо WHERE CURRENT OF, либо UPDATE ?

Собственно вопросы отмечены. Может быть кто - нибудь уже парился и проверял различные варианты интересует оптимальное решение или хоты бы плюсы и минусы конкретных реализаций.
21 сен 04, 10:35    [974459]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
BOL - UPDATE

A positioned update using a WHERE CURRENT OF clause updates the single row at the current position of the cursor. This can be more accurate than a searched update that uses a WHERE <search_condition> clause to qualify the rows to be updated. A searched update modifies multiple rows when the search condition does not uniquely identify a single row.

То бишь для обновления по условию серверу еще придется найти обновляемую запись(и). В то время как текущий указатель курсора уже позиционирован на этой записи.
21 сен 04, 12:02    [974905]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Спасибо, я смутно догадывался, что курсор обновляется быстрее :), однако стоит ли этот выйгрыш, передачи курсора внутрь процедуры или использования глобального курсора. Я просил поделиться субъективным опытом, подводными камнями.

Заранее благодарю.
21 сен 04, 12:40    [975065]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Glory
Member

Откуда:
Сообщений: 104760
однако стоит ли этот выйгрыш, передачи курсора внутрь процедуры или использования глобального курсора
Не совсем понятно как по вашему передача параметров или тип курсора может повлиять на UPDATE WHERE CURRENT OF ?
21 сен 04, 12:46    [975087]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
Не на UPDATE WHERE CURRENT OF конечно не повлияет, наверное нужно было по другому назвать топик. Просто это был один из вопросов, наиболее четко формулируемых :) поэтому он и попал в заголовок.

Может повлиять, например, следующее:
Если передаем курсор в переменной, то тратим время на передачу параметра, а если используем глобальный курсор, то процедура становится жестко привязанной к имени курсора, что накладывает ограничения на вложенный вызов, если потребуется, если же передаем в переменых и в них же возвращаем результаты, то тратим время на передачу множества парметров и усложняем изначальную разработку, зато получаем автономное решение менее зависимое от структуры БД.

Меня как раз и интересуют подобные суждения, основанные на личном или чужом опыте.
21 сен 04, 13:11    [975190]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Алексей2003.
Guest
а что мешает использовать имена курсоров вполне осмысленными? при динамическом формировании запроса, права проверяются от имени пользователя запустившего запрос, а не от имени владельца процедуры.
что мешает использовать локальный курсор вместо глобального?

P.S. Толстой?
21 сен 04, 16:53    [976224]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Sargos
Member

Откуда: Саратов
Сообщений: 563
По порядку:
1. Про "осмысленные имена" не понял ???
2. Динамика не подходит изначално, т.к. политика безопасности исключает прямой доступ пользователей к таблицам.
3. Локальный курсор будет невидим в ввызываемой процедуре.
21 сен 04, 17:39    [976452]     Ответить | Цитировать Сообщить модератору
 Re: UPDATE WHERE CURRENT OF vs UPDATE  [new]
Алексей2003.
Guest
по поводу подводных камней.
выяснилось, что апдейты, без курсоров (сразу все записи, которые нужно проапдейтить) работают быстрее (практически усегда, для тех кто начнет возражать).
если использовать курсоры, в ходе экспериментов выяснилось, что если использовать в выборке из курсора тогда лучше воспользоваться выборка по кластерному ключу, выборка параметров из таблицы, обновление таблицы через курсор.
P.S. это только наши эксперименты
21 сен 04, 18:01    [976563]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить