Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
К таблице прицеплен огро-о-о-мный триггер. В самом начале триггера стоит проверка if Update(SomeField)... тогда выполняется его тело. В противном случае триггер ничего не делает (производится выход из него). Если я делаю Update совсем другого поля (по которому триггер запускается, но на данной проверке его работа и заканчивается), то почему-то наблюдаются существенные тормоза (update проходит на протяжении секунды или даже более). Проверяю отладчиком - основное тело триггера действительно не выполняется. Удаляю триггер - все работает со свистом. Создаю снова - опять тормоза. Заподозрил, что такие тормоза возникают из-за загрузки кода триггера в процедурный кэш (повторяю, триггер весьма увесистый). Однако, он же в этом кэше должен на какое-то время оставаться? Однако, если я подряд несколько раз выдаю команду update по полю, которое не должно вызывать отработку основной части триггера, тормоза возникают не только при первом вызове команды, но и при последующих. Кто может подсказать, в чем загвоздка? Он что, каждый раз по новой грузится в процедурный кэш? И как ему объяснить, что он там должен остаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2001, 16:59 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
а как ты отладчиком проверял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2001, 09:57 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
Может сервер каждый раз делает перекомпиляцию триггера .... тогда могут возникать тормоза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2001, 10:22 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
2Sahon. Этот прием случайно открыл, а до того и сам не знал, как отлаживать триггеры. Делаешь любую хранимую процедуру, которая выполняет команду, приводящую к запуску триггера. Запускаешь ее в отладчике QA в пошаговом режиме, нажимая кнопку "шагнуть внутрь" и попадаешь отладчиком в тело триггера... 2Andrey. А с чего бы ему повторно компилировать триггер? Я ведь ничего не модифицировал. Это по меньшей мере странно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2001, 12:00 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
Повторная компиляция выполняется в очень многих случаях. Советую, если возможно, тело триггера перенести в ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.06.2001, 16:03 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
А может это как раз тот случай, когда стоит разбить этот огро-о-о-мный триггер на несколько менее огромных? Хотя теоретически никакого выигрыша это принести не должно, впрочем как и не должго быть тормозов в исходном триггере. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2001, 16:21 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
Не совсем по теме, но на днях столкнулся с интересной особенностью транслятора SQL под SQL2000. Пишу строку в хранимой процедуре: DECLARE @str varchar(255) SET @str=' CREATE PROCEDURE ...' Сохраняю процедуру. Открываю. Там уже SET @str=' ALTER PROCEDURE ...' Опаньки! а зачем же они строку то на корректность синтаксиса проверяют?! Причем вариант SET @str='CREATE PROCEDURE ...' отрабатывает как надо. Это я все к тому, что как оно внутри у них работает понять трудно, если вобще возможно Но стремиться надо! P.S. Никто не сталкивался с рекомендациями от Microsoft не использовать комментарий '--'. Тоже очень любопытная штучка ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2001, 07:31 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
Триггер действительно огрооо-оомный. Эмуляция рекурсивного алгоритма, реализующего пересчет прав доступа при изменении членства в ролях, либо при изменении прав ролей e.t.c. И тут от задержки никуда не уйдешь. Меня волновал вопрос, почему фактически эта же задержка возникает, когда основное тело триггера НЕ выполняется. Я пошел другим путем. Разбил таблицу на две. В одной оставли поля, с которыми работает триггер, в другой - все остальные поля. Когда триггер срабатывает, возникает задержка на 1,5 секунды. Когда трогаешь поля, по которым триггер сработать не должен, задержки никакой нет (потому что поля теперь в другой таблице). Но вопрос остался открытым. Почему емкий триггер, у которого выполняется 0,1% кода (выполняется только проверка в начале триггера) вызывает такую же задержку, как триггер, у которого выполняются остальные 99,9% со всему циклами и множественными update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2001, 07:33 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
To Warcat: У меня даже так: CREATE PROCEDURE test AS DECLARE @str varchar(255) SET @str='RRRR CREATE PROCEDURE ...' GO Преобразует CREATE в ALTER... To Garya: Вопрос не совсем "остался открытым". Задержка скорее всего из-за перекомпиляции, а её отсутствие никто не обещал. А решить проблему можно вызовом процедур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2001, 08:02 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
Насчет преобразований CREATE в ALTER Очевидно это делает клиентская часть. И проверка синтаксиса здесь ни при чем. Если создавать процедуру запросом из QA ничего такого не произойдет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2001, 11:09 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
2 alexeyvg: >Вопрос не совсем "остался открытым". Задержка скорее всего из-за перекомпиляции, а её отсутствие никто не обещал. Никто не обещал и перекоипиляцию. Вообще-то определение триггера - "особый тип хранимых процедур". Следовательно должен компилироваться при первом вызове и затем хранить план выполнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2001, 13:10 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
>SergSuper Понятно, что клиентская часть. Я сам нормально процедуры создал из QA. Я просто упомянул это как пример нелогичности работы ПО. А синтаксис пусть и на клиенте, но там все таки проверяется Иначе откуда такая "грамотная" подмена. Такой же прикол с созданием функций. Уж не помню что конкретно, но писал функцию,которая упорно не хотела создаваться в EM. Потратил часа 2 на поиск ошибки. Потом скопировал код в QA и все заработало. Даже не знаю смешно это или грустно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 05:42 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
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 только прошла синтаксический контроль и всё! Она при выполнении будет перекомпилироваться каждый раз. Т.е. есть определённый набор условий, при которых перекомпиляция выполняется каждый раз при выполнении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 08:25 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
2 alexeyvg А на чем основывается утверждение, что вторая процедура будет перекомпилироваться? Сообщите пожалуйста как Вы это определяете. Вообще то для таких случаев используется опция WITH RECOMPILE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 09:24 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 11:08 |
|
||
|
Необъяснимые тормоза при работе триггера
|
|||
|---|---|---|---|
|
#18+
Спасибо. Это многое обьясняет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2001, 12:47 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3569&tid=1826497]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 261ms |
| total: | 398ms |

| 0 / 0 |
