Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
MixaCh
Member

Откуда:
Сообщений: 183
Спрашивал вчера - кто читал, извините за повтор - очень надо - может сегодня народу больше - кто-нибудь и знает....

Добрый день всем!!!

В последнее время вплотную столкнулся со следующей проблемой:
"Тяжелая" вставка (изменение, удаление) записей в таблицы при возрастании объема данных...

Сначала пытался "ковырять" индексы, триггера (добавлять условия) и пр...

Однажды было время - переписал в триггере запрос типа:
   if exists (Select ... from inserted (deleted), Table1-N....

Where inserted.Field = Table(i).Field...)


на
    Declare c_cur cursor for

select ... from inserted (deleted)....
...
If Exists (select ... from Table1-N
where Table(i).Field = @var) ....



Через Query Analyzer - чуть не обалдел - стоимость запросов упала на порядки!!!!! Да и с клиента на глаз заметно!!!!!
Понятно, что их кол-во может возрасти, но для типового клиента (изменение 1 записи за раз) - не принципиально....

Что это - баг, или некорректность в плане запроса или еще что...
Просто не хотелось бы переписывать все запросы на курсоры - труд грандиозный....

Может быть я чего не понимаю или не знаю, может есть какой либо generate statistic или еще какая приблуда?!?!?

Заранее спасибо за ответы....
3 фев 03, 17:00    [120745]     Ответить | Цитировать Сообщить модератору
 Re: Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
Если я правильно понял, то Вы каждый раз в курсоре выполняете
if exists....

А о какой статистике и быстроте может идти речь при курсоре.
Почему Вы ушли от первого варианта ?
3 фев 03, 17:36    [120791]     Ответить | Цитировать Сообщить модератору
 Re: Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
MixaCh
Member

Откуда:
Сообщений: 183
Может я не очень внятно объяснил - попробую поправиться...

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

Так вот, если я пищу эту проверку напрямую - типа есть записи в таблице Inner join inserted и так далее, то выполняется долго...

Если же я объявляю курсор по inserted, загоняю все в переменные и потом в запросах на внешние таблицы использую в where эти переменные, то выполняется намного быстрее...

Прочитал - все равно путанно.... но вроде как лучше...
3 фев 03, 17:46    [120802]     Ответить | Цитировать Сообщить модератору
 Re: Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
Glory
Member

Откуда:
Сообщений: 104760
1. Планы выполнения запросов
Select ... from inserted (deleted), Table1-N.... Where inserted.Field = Table(i).Field...
и
select ... from Table1-N where Table(i).Field = @var

одинаковы ? Или все таки разные ?

2. В случае курсора вы только одну запись читаете из inserted (deleted) ? как же другие записи ?
Или у вас триггер разрешает только по-записные операции (вроде бы нет, судя по "при возрастании объема данных")?
Или вы выполняете запрос для каждой строки курсора ?
3 фев 03, 19:29    [120900]     Ответить | Цитировать Сообщить модератору
 Re: Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
MixaCh
Member

Откуда:
Сообщений: 183
В том то и дело, что планы он показывает разные....

В случае курсора (естественно цикл по всем записям inserted, deleted) он показывает Constant scan - и далее все выполняется мгновенно (Cost порядка 0,00NN)

Если же запрос с использование inserted, то показывает Inserted scan со стоимостью 1,N...

Вот я и думаю....

И Вобще - кто-нибудь кроме разработчиков самого сервера представляет, что это за "псевдо таблицы изменяемых строк, доступные в триггере..." - кроме такого определения ничего в хелпе не нашел!!

Надеюсь, что это не полная копия таблицы "с помеченными изменяемыми записями", причем без индексов!!! Другого объяснения таким стоимостям я не нахожу.....
3 фев 03, 20:03    [120917]     Ответить | Цитировать Сообщить модератору
 Re: Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
Glory
Member

Откуда:
Сообщений: 104760
Использованием индексов и не пахнет. А какие из них у вас есть ?
Есть ли индексы на поля использованные в JOIN-ах ?
3 фев 03, 20:55    [120941]     Ответить | Цитировать Сообщить модератору
 Re: Inserted или курсор?!? Спрашивал вчера - кто читал, извините за повтор  [new]
MixaCh
Member

Откуда:
Сообщений: 183
Естественно...

ErWin генерит на Внешние ключи, да и руками приходится доделывать, при необходимости....

Я как-то не очень понимаю, что же у меня происходит - или это только у меня??!?! Ладно бы, но на двух разных серверах на расстоянии 2тыс. км друг от друга - ситуация до слез похожая....

Да, помниться пробовал еще и такой подход:
Отбирать в курсор не все нужные для проверок поля, а только ключевые.
Потом соединял с базовой таблицей, чтобы вытащить остальные - все равно работало на порядок быстрее, чем сам inserted....
3 фев 03, 21:03    [120944]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить