powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Необъяснимые тормоза при работе триггера
17 сообщений из 17, страница 1 из 1
Необъяснимые тормоза при работе триггера
    #32007177
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К таблице прицеплен огро-о-о-мный триггер. В самом начале триггера стоит проверка if Update(SomeField)... тогда выполняется его тело. В противном случае триггер ничего не делает (производится выход из него).
Если я делаю Update совсем другого поля (по которому триггер запускается, но на данной проверке его работа и заканчивается), то почему-то наблюдаются существенные тормоза (update проходит на протяжении секунды или даже более). Проверяю отладчиком - основное тело триггера действительно не выполняется. Удаляю триггер - все работает со свистом. Создаю снова - опять тормоза.
Заподозрил, что такие тормоза возникают из-за загрузки кода триггера в процедурный кэш (повторяю, триггер весьма увесистый). Однако, он же в этом кэше должен на какое-то время оставаться? Однако, если я подряд несколько раз выдаю команду update по полю, которое не должно вызывать отработку основной части триггера, тормоза возникают не только при первом вызове команды, но и при последующих.
Кто может подсказать, в чем загвоздка? Он что, каждый раз по новой грузится в процедурный кэш? И как ему объяснить, что он там должен остаться?
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007223
sahon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как ты отладчиком проверял?
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007226
Andrey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может сервер каждый раз делает перекомпиляцию триггера .... тогда могут возникать тормоза
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007236
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Sahon. Этот прием случайно открыл, а до того и сам не знал, как отлаживать триггеры. Делаешь любую хранимую процедуру, которая выполняет команду, приводящую к запуску триггера. Запускаешь ее в отладчике QA в пошаговом режиме, нажимая кнопку "шагнуть внутрь" и попадаешь отладчиком в тело триггера...

2Andrey. А с чего бы ему повторно компилировать триггер? Я ведь ничего не модифицировал. Это по меньшей мере странно...
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007246
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторная компиляция выполняется в очень многих случаях.
Советую, если возможно, тело триггера перенести в ХП.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007344
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может это как раз тот случай, когда стоит разбить этот огро-о-о-мный триггер на несколько менее огромных? Хотя теоретически никакого выигрыша это принести не должно, впрочем как и не должго быть тормозов в исходном триггере.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007375
Warcat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не совсем по теме, но на днях столкнулся с интересной особенностью транслятора SQL под SQL2000.

Пишу строку в хранимой процедуре:
DECLARE @str varchar(255)
SET @str='
CREATE PROCEDURE ...'

Сохраняю процедуру.
Открываю.
Там уже
SET @str='
ALTER PROCEDURE ...'

Опаньки! а зачем же они строку то на корректность синтаксиса проверяют?!
Причем вариант SET @str='CREATE PROCEDURE ...' отрабатывает как надо.
Это я все к тому, что как оно внутри у них работает понять трудно, если вобще возможно
Но стремиться надо!

P.S. Никто не сталкивался с рекомендациями от Microsoft не использовать комментарий '--'.
Тоже очень любопытная штучка
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007376
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггер действительно огрооо-оомный. Эмуляция рекурсивного алгоритма, реализующего пересчет прав доступа при изменении членства в ролях, либо при изменении прав ролей e.t.c. И тут от задержки никуда не уйдешь. Меня волновал вопрос, почему фактически эта же задержка возникает, когда основное тело триггера НЕ выполняется.
Я пошел другим путем. Разбил таблицу на две. В одной оставли поля, с которыми работает триггер, в другой - все остальные поля. Когда триггер срабатывает, возникает задержка на 1,5 секунды. Когда трогаешь поля, по которым триггер сработать не должен, задержки никакой нет (потому что поля теперь в другой таблице).
Но вопрос остался открытым. Почему емкий триггер, у которого выполняется 0,1% кода (выполняется только проверка в начале триггера) вызывает такую же задержку, как триггер, у которого выполняются остальные 99,9% со всему циклами и множественными update.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007383
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Warcat:
У меня даже так:

CREATE PROCEDURE test
AS
DECLARE @str varchar(255)
SET @str='RRRR CREATE PROCEDURE ...'
GO

Преобразует CREATE в ALTER...


To Garya:
Вопрос не совсем "остался открытым". Задержка скорее всего из-за перекомпиляции, а её отсутствие никто не обещал.
А решить проблему можно вызовом процедур.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007419
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет преобразований CREATE в ALTER

Очевидно это делает клиентская часть. И проверка синтаксиса здесь ни при чем.
Если создавать процедуру запросом из QA ничего такого не произойдет
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007436
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alexeyvg:
>Вопрос не совсем "остался открытым". Задержка скорее всего из-за перекомпиляции, а её отсутствие никто не обещал.

Никто не обещал и перекоипиляцию. Вообще-то определение триггера - "особый тип хранимых процедур". Следовательно должен компилироваться при первом вызове и затем хранить план выполнения.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007467
Warcat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>SergSuper
Понятно, что клиентская часть. Я сам нормально процедуры создал из QA. Я просто упомянул это как пример нелогичности работы ПО. А синтаксис пусть и на клиенте, но там все таки проверяется Иначе откуда такая "грамотная" подмена. Такой же прикол с созданием функций. Уж не помню что конкретно, но писал функцию,которая упорно не хотела создаваться в EM. Потратил часа 2 на поиск ошибки. Потом скопировал код в QA и все заработало. Даже не знаю смешно это или грустно.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007479
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Павел
Триггер - особый тип хранимых процедур. Но это не значит, что он (или хранимая процедура) "должен компилироваться при первом вызове и затем хранить план выполнения".
Пример:
create proc test1
as
select bbb from sysobjects
go
Ошибка: Invalid column name 'bbb'.

create proc test2
as
select bbb from sysobjects_xaxaxa
go
Нет ошибки!

Процедура test1 прошла синтаксический контроль и должна быть скомпилирована (если вместо bbb указать правильное поле), и при выполнении перекомпилироваться не будет.
Процедура test2 только прошла синтаксический контроль и всё! Она при выполнении будет перекомпилироваться каждый раз.

Т.е. есть определённый набор условий, при которых перекомпиляция выполняется каждый раз при выполнении.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007489
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 alexeyvg
А на чем основывается утверждение, что вторая процедура будет перекомпилироваться? Сообщите пожалуйста как Вы это определяете. Вообще то для таких случаев используется опция WITH RECOMPILE.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007495
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Павел:
Привожу текст из BOL (Кстати, это важнейшее отличие Sybase -ядря MSSQL6.x и 4.х от нового - MSSQL 7.х и 2000; оно важно для переноса приложений).
Обращаю внимание, что п.1 относится не только к врем. таблицам, созданным вне процедуры/триггера, но и ко всем объектам, не существующим во время создания процедуры/триггера.
In SQL Server 2000, use of temporary tables in stored procedures and triggers may cause the stored procedure or trigger to be recompiled every time it is used. To avoid such recompilation, stored procedures or triggers that use temporary tables must meet the following requirements:
1. In the stored procedure or trigger, all statements that contain the name of a temporary table must refer to a temporary table created in the same stored procedure. The temporary table cannot have been created in a calling or called stored procedure, or in a string executed using EXECUTE or sp_executesql.
2. All statements that contain the name of a temporary table must appear syntactically after its creation in the stored procedure or trigger.
3. The stored procedure or trigger cannot contain any DECLARE CURSOR statement whose SELECT statement references a temporary table.
4. All statements that contain the name of any temporary table must precede any DROP TABLE statement that references a temporary table. DROP TABLE statements are not needed for temporary tables created in a stored procedure; the tables are dropped automatically when the procedure terminates.
5. Statements creating a temporary table (such as CREATE TABLE or SELECT INTO) may not appear in a control-of-flow statement such as IF...ELSE or WHILE.
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007504
Павел
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Это многое обьясняет...
...
Рейтинг: 0 / 0
Необъяснимые тормоза при работе триггера
    #32007507
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за разъяснение. У меня как раз в триггере используются временные таблицы.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Необъяснимые тормоза при работе триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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