MSSQL. batch execution
От: _AsM Россия  
Дата: 12.05.03 09:08
Оценка:
Доброе время суток, All.

Подскажите, если не трудно.
У меня для таблицы на insert есть тригер, и один раз мне нужно в нее вставить сразу очень много записей, естественно этот запрос, вот такого вида:

insert test(...) values(...)
insert test(...) values(...)
...


отрабатывает стршно долго (на каждый insert срабатывает тригер, и тратится время на его исполнение)
причем, природа тригера такая, что его можно вызвать и один раз, после всех insert'ов, и он все приведет в порядок, да даже и без этого — в тригере же есть таблица inserted — так вот как сделать что бы в ней были все всталяемые записи? а то у меня в этой таблице всегда одна запись.
в каком случае в таблице insered содержится несколько сразу записей?

Отсюда хочу сгрупировать все вставки как бы в один запрос (думаю это batch) и что бы тригер выполнился после него.

Спасибо за помощь!
WBR, AsM

P.S. сорри если данный вопрос уже задавали... что то поиск не работает.
Re: MSSQL. batch execution
От: Lloyd Россия  
Дата: 12.05.03 09:12
Оценка: 2 (1)
Здравствуйте, _AsM, Вы писали:

_AM>Доброе время суток, All.


_AM>Подскажите, если не трудно.

_AM>У меня для таблицы на insert есть тригер, и один раз мне нужно в нее вставить сразу очень много записей, естественно этот запрос, вот такого вида:

_AM>
_AM>insert test(...) values(...)
_AM>insert test(...) values(...)
_AM>...
_AM>


_AM>отрабатывает стршно долго (на каждый insert срабатывает тригер, и тратится время на его исполнение)

_AM>причем, природа тригера такая, что его можно вызвать и один раз, после всех insert'ов, и он все приведет в порядок, да даже и без этого — в тригере же есть таблица inserted — так вот как сделать что бы в ней были все всталяемые записи? а то у меня в этой таблице всегда одна запись.
_AM>в каком случае в таблице insered содержится несколько сразу записей?

_AM>Отсюда хочу сгрупировать все вставки как бы в один запрос (думаю это batch) и что бы тригер выполнился после него.


_AM>Спасибо за помощь!

_AM>WBR, AsM

_AM>P.S. сорри если данный вопрос уже задавали... что то поиск не работает.


Вставлять во временную таблицу, и после этого --
INSERT INTO [твоя таблица] SELECT * FROM [временная таблица]
Re[2]: MSSQL. batch execution
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 12.05.03 09:48
Оценка: 2 (1)
Здравствуйте, Lloyd, Вы писали:

[]

L>Вставлять во временную таблицу, и после этого --

L>
L>INSERT INTO [твоя таблица] SELECT * FROM [временная таблица]
L>


Если триггер обрабатывает каждую запись и написан правильно , то это не поможет.
Может перенести логику в расширенную процедуру.
Re[3]: MSSQL. batch execution
От: Lloyd Россия  
Дата: 12.05.03 09:55
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Если триггер обрабатывает каждую запись и написан правильно , то это не поможет.

AS>Может перенести логику в расширенную процедуру.

Почему не поможет? Триггер срабатывает не на вставку записи в таблицу, а на отдельную команду (в данном случае INSERT). А сколько записей эка комманда затронет -- не важно.
Re[4]: MSSQL. batch execution
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 12.05.03 10:02
Оценка:
Здравствуйте, Lloyd, Вы писали:

хъ

Я в курсе на что срабатывает триггер.
Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.
Re[5]: MSSQL. batch execution
От: Lloyd Россия  
Дата: 12.05.03 10:04
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Я в курсе на что срабатывает триггер.

AS>Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.

Тогда тебе однозначно следует почитать исходное сообщение.
Re[6]: MSSQL. batch execution
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 12.05.03 10:19
Оценка:
Здравствуйте, Lloyd, Вы писали:

[]

L>Тогда тебе однозначно следует почитать исходное сообщение.


Ок.
Действительно, совет был не много не в кассу.
Re[5]: MSSQL. batch execution
От: _AsM Россия  
Дата: 12.05.03 10:19
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Здравствуйте, Lloyd, Вы писали:


AS>Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.


inserted не лопатится.
Но все равно реализовать через insert into не удасться, т.к. на самом деле у меня все более запущено...
таблиц много, во всех есть тригеры, в самом простом варианте я хотел собирать в некоторых местах все выполняющиеся insert'ы (в разные таблицы (работа с базой идет через свой обьект)) и потом накомившиеся запросы посылать сразу, что бы тригер отработал один раз, но, как выясняется это непросто... тем более что эта фигня должны быть изолированой для каждого пользователя.
Но из сложившийся ситуации хочется как то выйти... сейчас думаю использовать @@SPID
буду иметь таблицу параметров сессии, там устанавливать в какой то момент флаг что бы тригер не отрабатывал (соответственно в тригере проверку если не надо, то не делать действие... а потом включать...) ох и кривуще... никто не имеет мыслей, как бы это по нормальному, если можно..., и вопрос возник тут... надо тело тригера как то уметь выполнять когда надо...
как можно выполнить тригер не выполняя insert? что то типа "execute trigger..."

Не смеяться
WBR, AsM
Re[6]: MSSQL. batch execution
От: Lloyd Россия  
Дата: 12.05.03 10:22
Оценка:
Здравствуйте, _AsM, Вы писали:

AS>Если в нем будет лопатиться вся табличка inserted и для каждой записи выполняться что-то сложное — не поможет.


_AM> inserted не лопатится.

_AM>Но все равно реализовать через insert into не удасться, т.к. на самом деле у меня все более запущено...
_AM>таблиц много, во всех есть тригеры, в самом простом варианте я хотел собирать в некоторых местах все выполняющиеся insert'ы (в разные таблицы (работа с базой идет через свой обьект)) и потом накомившиеся запросы посылать сразу, что бы тригер отработал один раз, но, как выясняется это непросто... тем более что эта фигня должны быть изолированой для каждого пользователя.
_AM>Но из сложившийся ситуации хочется как то выйти... сейчас думаю использовать @@SPID
_AM>буду иметь таблицу параметров сессии, там устанавливать в какой то момент флаг что бы тригер не отрабатывал (соответственно в тригере проверку если не надо, то не делать действие... а потом включать...) ох и кривуще... никто не имеет мыслей, как бы это по нормальному, если можно..., и вопрос возник тут... надо тело тригера как то уметь выполнять когда надо...
_AM>как можно выполнить тригер не выполняя insert? что то типа "execute trigger..."

_AM>Не смеяться

_AM>WBR, AsM

Логику триггера вынести в хранимую процедуру, и из триггра ее вызывать.
Re: MSSQL. batch execution
От: MoZ Россия  
Дата: 14.05.03 10:32
Оценка: 36 (2)
Здравствуйте, _AsM, Вы писали:

A>
A>insert test(...) values(...)
A>insert test(...) values(...)
A>...
A>


A>Отсюда хочу сгрупировать все вставки как бы в один запрос (думаю это batch) и что бы тригер выполнился после него.


Можешь попробовать вставлять данные примерно такой командой
insert test(...)
Select x,y,z
UNION ALL
Select x1,y1,z1
UNION ALL ...

Триггер сработает один раз.
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.