Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
alexeyvg
2 RubinDm
if (not(exists(select * from [inserted]))
не нужно, обновление и так не будет потреблять ресурсов, если в inserted ничего нет.
Это самый простой и быстрый способ понять, есть ли записи, которые реально были подвергнуты изменениям. Это нужно, чтобы как можно быстрее завершить исполнение тригера, если фактически никаких изменений вообще не было.

alexeyvg
2 RubinDm
if (not(exists(select [new].[ID] ...)))
не нужно, запрос в update сделает то же самое.
Запрос в update сделает не тоже самое. Если убрать проверку, то последующий запрос update гарантированно вынудит сервер этот update исполнить. Да, возможно никакие записи в результате update'а не изменятся, но само исполнение команды update состоится, равно как и исполнение соответствующих тригеров, включая наш, который фактически окажется рекурсивным, хоть и не зацикленным. Хорошо, если тригеры в рекурсии вообще разрешены в базе к исполнению, но это не всегда так бывает. Вобщем, такой update будет заведомо дороже проверки на необходимость его исполнения. Кроме того, проверка - это EXISTS, т.е. это дешевый запрос, который ищет первую и только первую запись, удовлетворяющую условиям поиска.

alexeyvg
А из обновления можно убрать лишний джойн:

можно, и скорее даже нужно.
19 июн 12, 13:12    [12737741]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
RubinDm
Это самый простой и быстрый способ понять, есть ли записи, которые реально были подвергнуты изменениям. Это нужно, чтобы как можно быстрее завершить исполнение тригера, если фактически никаких изменений вообще не было.

Самый простой и быстрый способ - это проверить в триггере @@ROWCOUNT
19 июн 12, 13:19    [12737825]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
RubinDm
Вызов функции update(Field1) отвечает на вопрос, было ли упомянуто поле Field1 в инструкции update в части set.
Вот! Наконец-то.
Но ценность этой информации практически равна нулю.
В данной конкретной теме похоже, что UPDATE вызывается только для изменения одного поля Field1.
А в общем случае большинство клиентов не заморачиваются определением того,
какие поля им надо перечислить в SET, а какие нет.
Чаще всего перечисляются все, просто некоторые остаются с теми же значениями.
Факт наличия поля в списке SET сам по себе ни о чём не говорит.
19 июн 12, 13:21    [12737848]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
iap
RubinDm
Вызов функции update(Field1) отвечает на вопрос, было ли упомянуто поле Field1 в инструкции update в части set.
Вот! Наконец-то. Но ценность этой информации практически равна нулю.
О как.
iap
В данной конкретной теме похоже, что UPDATE вызывается только для изменения одного поля Field1.
Это лишь догадка, Ваше умозаключение, которое Вы делаете исходя из Вашей практики разработок.
iap
А в общем случае большинство клиентов не заморачиваются определением того, какие поля им надо перечислить в SET, а какие нет. Чаще всего перечисляются все, просто некоторые остаются с теми же значениями. Факт наличия поля в списке SET сам по себе ни о чём не говорит.
Я не знаю, о каком большинстве случаев говорите Вы, но подозреваю, что именно Вы именно так и пишите update'ы, не вникая в тонкости того, чего может стоить серверу update одного поля вместо десяти. В нашей конторе разговор с такими разработчиками, которые не видят разницы, очень короткий. Те, которые не понимают и продолжают упираться и писать говнокод, очень быстро оказваются на панели. Что касается этого форума - тут люди учатся... и я не вижу смысла учить их плохому.
19 июн 12, 13:45    [12738155]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Glory
Самый простой и быстрый способ - это проверить в триггере @@ROWCOUNT
Да, согласен. но я предпочитаю этим не пользоваться, т.к. пишу я в команде и, увы, перед моим @@rowcount кто-то (например, студент на испыталове, который не ведает что творит) в любой момент может что-то дописать, и не раз так было. А шишки тем временем (пока не разобрались в чем дело) падали на меня, ибо контроль версий кода применительно к базам данных пока еще не то чтобы очень развит. Посему я сразу стараюсь писать так, чтобы все было предельно устойчиво хотя бы к тем отказам, которые предсказуемы, если это возможно без критического ущерба производительности. Такая практика не раз меня спасала.
19 июн 12, 13:57    [12738309]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
RubinDm
Посему я сразу стараюсь писать так, чтобы все было предельно устойчиво хотя бы к тем отказам, которые предсказуемы, если это возможно без критического ущерба производительности. Такая практика не раз меня спасала.

Кто-то может и перед вашей проверкой просто дописать условный или безусловный выход из триггера.
Поэтому ваш код никакой усточивости не добавляет.
19 июн 12, 14:03    [12738386]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
RubinDm
Те, которые не понимают и продолжают упираться и писать говнокод, очень быстро оказваются на панели. Что касается этого форума - тут люди учатся... и я не вижу смысла учить их плохому.
C моей точки зрения именно Вы и выложили тут говнокод.
Заметьте, я впервые позволил себе подобную резкость.
В отличие от Вас.

И да, это правда, - всё, что я тут пишу, основано на моём же личном опыте.
Не вижу в этом ничего плохого.
19 июн 12, 14:04    [12738405]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
RubinDm
iap
А в общем случае большинство клиентов не заморачиваются определением того, какие поля им надо перечислить в SET, а какие нет. Чаще всего перечисляются все, просто некоторые остаются с теми же значениями. Факт наличия поля в списке SET сам по себе ни о чём не говорит.
Я не знаю, о каком большинстве случаев говорите Вы, но подозреваю, что именно Вы именно так и пишите update'ы, не вникая в тонкости того, чего может стоить серверу update одного поля вместо десяти. В нашей конторе разговор с такими разработчиками, которые не видят разницы, очень короткий. Те, которые не понимают и продолжают упираться и писать говнокод, очень быстро оказваются на панели. Что касается этого форума - тут люди учатся... и я не вижу смысла учить их плохому.

http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx
In this post, I’ll look at a generalisation of this problem: what is the impact of updating a column to the value it already contains?
...
SQL Server contains a number of optimisations to avoid unnecessary logging or page flushing when processing an UPDATE operation that will not result in any change to the persistent database.
19 июн 12, 14:04    [12738409]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
RubinDm
Это самый простой и быстрый способ понять, есть ли записи, которые реально были подвергнуты изменениям. Это нужно, чтобы как можно быстрее завершить исполнение тригера, если фактически никаких изменений вообще не было.

Самый простой и быстрый способ - это проверить в триггере @@ROWCOUNT
Приведёт к удивительным результатам в MERGE!
Я вот именно поэтому потихоньку меняю проверку @@ROWCOUNT на EXISTS
19 июн 12, 14:06    [12738426]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
офигеть
Guest
RubinDm
iap
пропущено...
Вот! Наконец-то. Но ценность этой информации практически равна нулю.
О как.
iap
В данной конкретной теме похоже, что UPDATE вызывается только для изменения одного поля Field1.
Это лишь догадка, Ваше умозаключение, которое Вы делаете исходя из Вашей практики разработок.
iap
А в общем случае большинство клиентов не заморачиваются определением того, какие поля им надо перечислить в SET, а какие нет. Чаще всего перечисляются все, просто некоторые остаются с теми же значениями. Факт наличия поля в списке SET сам по себе ни о чём не говорит.
Я не знаю, о каком большинстве случаев говорите Вы, но подозреваю, что именно Вы именно так и пишите update'ы, не вникая в тонкости того, чего может стоить серверу update одного поля вместо десяти. В нашей конторе разговор с такими разработчиками, которые не видят разницы, очень короткий. Те, которые не понимают и продолжают упираться и писать говнокод, очень быстро оказваются на панели. Что касается этого форума - тут люди учатся... и я не вижу смысла учить их плохому.

типа это у iap- говнокод?
рубиновый вы наш (с бриллиантовым кодом)...
19 июн 12, 14:13    [12738527]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
Glory
пропущено...

Самый простой и быстрый способ - это проверить в триггере @@ROWCOUNT
Приведёт к удивительным результатам в MERGE!

А именно к каким?
19 июн 12, 14:20    [12738594]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Glory
RubinDm
Посему я сразу стараюсь писать так, чтобы все было предельно устойчиво хотя бы к тем отказам, которые предсказуемы, если это возможно без критического ущерба производительности. Такая практика не раз меня спасала.
Кто-то может и перед вашей проверкой просто дописать условный или безусловный выход из триггера. Поэтому ваш код никакой усточивости не добавляет.
Некоторые и на заправках курить не стесняются. Но даже они в подавляющем большинстве своем творят такое по невнимательности, а не изходя из антисоциальных настроений. И на замечания с указанем пальчиком на знак "курить запрещено" реагируют, как правило, адекватно, и даже оперативно. Вывод: меры предосторожности лишинми не бывают.
19 июн 12, 14:21    [12738602]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Shakill
http://sqlblog.com/blogs/paul_white/archive/2010/08/11/the_2D00_impact_2D00_of_2D00_update_2D00_statements_2D00_that_2D00_don_2D00_t_2D00_change_2D00_data.aspx
In this post, I’ll look at a generalisation of this problem: what is the impact of updating a column to the value it already contains?
...
SQL Server contains a number of optimisations to avoid unnecessary logging or page flushing when processing an UPDATE operation that will not result in any change to the persistent database.

интересно! изучу подробнее в ближайшее время. Но даже после быстрого ознакомления я не думаю, что сервер рискнет что-то выдумывать в части оптимизации в случаях, когда есть тригеры, в которых может быть прописано что угодно, включая реакции на "холостые" update'ы.
19 июн 12, 14:30    [12738677]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
RubinDm
Некоторые и на заправках курить не стесняются. Но даже они в подавляющем большинстве своем творят такое по невнимательности, а не изходя из антисоциальных настроений. И на замечания с указанем пальчиком на знак "курить запрещено" реагируют, как правило, адекватно, и даже оперативно. Вывод: меры предосторожности лишинми не бывают.

Ну так о том и речь.
Ваше способ получения число затронутых командой записей ничуть не стабильнее @@rowcount.
Потому что никак не предотвращает "курение на бензоколонке", т.е. исправление текста триггера
Имхо.
19 июн 12, 14:40    [12738768]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
RubinDm
Shakill
пропущено...

интересно! изучу подробнее в ближайшее время. Но даже после быстрого ознакомления я не думаю, что сервер рискнет что-то выдумывать в части оптимизации в случаях, когда есть тригеры, в которых может быть прописано что угодно, включая реакции на "холостые" update'ы.
В триггере может быть написано exec xp_cmdshell 'format c:'. Теперь, по вашей логике, таблицы вообще не надо модифицировать, чтобы чего не вышло?
19 июн 12, 14:40    [12738770]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
iap
пропущено...
Приведёт к удивительным результатам в MERGE!

А именно к каким?
@@ROWCOUNT в результате MERGE - это общее количество добавленных, изменённых и удалённых строк.
Например, 5 строк вставлено, 4 изменено и ни одной не удалено.
Однако, сработают все триггеры, и в каждом @@ROWCOUNT=5+4=9
Пример:
USE tempdb;
SET NOCOUNT ON;

IF OBJECT_ID(N'T1','U') IS NOT NULL DROP TABLE T1;
IF OBJECT_ID(N'T2','U') IS NOT NULL DROP TABLE T2;
CREATE TABLE T1(ID INT NOT NULL IDENTITY, X INT);
CREATE TABLE T2(ID INT NOT NULL IDENTITY, X INT);
INSERT T1(X)VALUES(2),(3);
INSERT T2(X)VALUES(1),(2),(3);
GO
CREATE TRIGGER DeleteT1 ON T1 FOR DELETE AS SELECT LEFT(N'Триггер '+OBJECT_NAME(@@PROCID),50),[COUNT]=COUNT(*),[@@ROWCOUNT]=@@ROWCOUNT FROM deleted;
GO
CREATE TRIGGER InsertT1 ON T1 FOR INSERT AS SELECT LEFT(N'Триггер '+OBJECT_NAME(@@PROCID),50),[COUNT]=COUNT(*),[@@ROWCOUNT]=@@ROWCOUNT FROM inserted;
GO
CREATE TRIGGER UpdateT1 ON T1 FOR UPDATE AS SELECT LEFT(N'Триггер '+OBJECT_NAME(@@PROCID),50),[COUNT]=COUNT(*),[@@ROWCOUNT]=@@ROWCOUNT FROM inserted;
GO
MERGE T1 USING T2 ON T1.X=T2.X
WHEN MATCHED THEN UPDATE SET X=T2.X
WHEN NOT MATCHED THEN INSERT(X)VALUES(T2.X)
WHEN NOT MATCHED BY SOURCE THEN DELETE;
GO
IF OBJECT_ID(N'T1','U') IS NOT NULL DROP TABLE T1;
IF OBJECT_ID(N'T2','U') IS NOT NULL DROP TABLE T2;
GO
19 июн 12, 14:46    [12738845]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
Гавриленко Сергей Алексеевич
RubinDm
пропущено...интересно! изучу подробнее в ближайшее время. Но даже после быстрого ознакомления я не думаю, что сервер рискнет что-то выдумывать в части оптимизации в случаях, когда есть тригеры, в которых может быть прописано что угодно, включая реакции на "холостые" update'ы.
В триггере может быть написано exec xp_cmdshell 'format c:'. Теперь, по вашей логике, таблицы вообще не надо модифицировать, чтобы чего не вышло?
Таблицы модифицировать надо. Но делать это надо только в тех случаях, когда это реально необходимо.
19 июн 12, 14:57    [12738961]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
RubinDm
Гавриленко Сергей Алексеевич
пропущено...
В триггере может быть написано exec xp_cmdshell 'format c:'. Теперь, по вашей логике, таблицы вообще не надо модифицировать, чтобы чего не вышло?
Таблицы модифицировать надо. Но делать это надо только в тех случаях, когда это реально необходимо.
С нетерпением жду пример кода, который будет определять, надо ли реально апдейтить 50 полей в таблице по 50 переменным, или вообще по временной таблице.
19 июн 12, 15:03    [12739046]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
RubinDm
Таблицы модифицировать надо. Но делать это надо только в тех случаях, когда это реально необходимо.
Даже тогда, когда проверка этой самой реальности дороже самих изменений?
19 июн 12, 15:04    [12739062]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
RubinDm
Member

Откуда:
Сообщений: 461
iap
Glory
пропущено...

А именно к каким?
@@ROWCOUNT в результате MERGE - это общее количество добавленных, изменённых и удалённых строк.
Например, 5 строк вставлено, 4 изменено и ни одной не удалено.
Однако, сработают все триггеры, и в каждом @@ROWCOUNT=5+4=9
Не стоит интерпретировать merge как три последовательные операции ( insert, update, delete ). Кроме того, мне непонято Ваше негодование, ибо там черным по белому сказано:
http://technet.microsoft.com/en-us/library/bb510625.aspx
Remarks...
When used after MERGE, @@ROWCOUNT (Transact-SQL) returns the total number of rows inserted, updated, and deleted to the client.
19 июн 12, 15:09    [12739125]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
RubinDm
Гавриленко Сергей Алексеевич
пропущено...
В триггере может быть написано exec xp_cmdshell 'format c:'. Теперь, по вашей логике, таблицы вообще не надо модифицировать, чтобы чего не вышло?
Таблицы модифицировать надо. Но делать это надо только в тех случаях, когда это реально необходимо.

как же с таким подходом писать INSTEAD OF UPDATE триггеры на таблицы с кучей полей? все же стоит в некоторых моментах рассчитывать на разумность сервера
19 июн 12, 15:10    [12739128]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
@@ROWCOUNT в результате MERGE - это общее количество добавленных, изменённых и удалённых строк.
Например, 5 строк вставлено, 4 изменено и ни одной не удалено.
Однако, сработают все триггеры, и в каждом @@ROWCOUNT=5+4=9

Все равно, на мой взгляд обращение к @@ROWCOUNT выгоднее запросов к inserted/deleted.
19 июн 12, 15:11    [12739148]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
RubinDm
iap
пропущено...
@@ROWCOUNT в результате MERGE - это общее количество добавленных, изменённых и удалённых строк.
Например, 5 строк вставлено, 4 изменено и ни одной не удалено.
Однако, сработают все триггеры, и в каждом @@ROWCOUNT=5+4=9
Не стоит интерпретировать merge как три последовательные операции ( insert, update, delete ). Кроме того, мне непонято Ваше негодование, ибо там черным по белому сказано:
http://technet.microsoft.com/en-us/library/bb510625.aspx
Remarks...
When used after MERGE, @@ROWCOUNT (Transact-SQL) returns the total number of rows inserted, updated, and deleted to the client.
Вы неадекватны.
Я отвечал конкретному человеку на конкретный вопрос.
При чём тут негодование?

И как же порекомендуете интерпретировать MERGE?
19 июн 12, 15:13    [12739166]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Glory
iap
@@ROWCOUNT в результате MERGE - это общее количество добавленных, изменённых и удалённых строк.
Например, 5 строк вставлено, 4 изменено и ни одной не удалено.
Однако, сработают все триггеры, и в каждом @@ROWCOUNT=5+4=9

Все равно, на мой взгляд обращение к @@ROWCOUNT выгоднее запросов к inserted/deleted.
Придётся тогда в своей документации запретить использовать таблицу в команде MERGE.
19 июн 12, 15:15    [12739182]     Ответить | Цитировать Сообщить модератору
 Re: Триггер  [new]
Glory
Member

Откуда:
Сообщений: 104751
iap
Придётся тогда в своей документации запретить использовать таблицу в команде MERGE.

Почему ?
Это проблема, если в вашем примере MERGE триггер на удаление сработает с пустыми таблицами inserted/deleted ?
19 июн 12, 15:17    [12739205]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить