Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать данный тригер? / 16 сообщений из 16, страница 1 из 1
20.07.2021, 14:34
    #40084866
RIO08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
Сваял типа универсальный тригер для записи изменений, но чую, что тормозит (без него на порядок быстрее). Если можно, дайте пару советов, что можно сделать...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
CREATE TABLE [dbo].[test1](
	[id_x] [int] IDENTITY(1,1) NOT NULL,
	[Name1] [varchar](250) NULL,
	[Name11] [varchar](250) NULL,
	[Name12] [varchar](250) NULL,
	[Name13] [varchar](250) NULL,
	[Name14] [varchar](250) NULL,
	[Name15] [varchar](250) NULL,
	[Name16] [varchar](250) NULL,
	[Name17] [varchar](250) NULL,
	[Name18] [varchar](250) NULL,
	[date_i] [datetime] NULL,
	[date_i1] [datetime] NULL,
	[userP] [varchar](50) NULL,
 CONSTRAINT [PK_test1] PRIMARY KEY CLUSTERED 
(
	[id_x] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[test1] ADD  CONSTRAINT [DF_test1_date_i1]  DEFAULT (getdate()) FOR [date_i1]
GO
ALTER TABLE [dbo].[test1] ADD  CONSTRAINT [DF_test1_userP]  DEFAULT (suser_sname()) FOR [userP]
GO

CREATE TABLE [dbo].[Log_Protocol](
	[PrID] [bigint] IDENTITY(1,1) NOT NULL,
	[TypeP] [int] NOT NULL,
	[DateP] [datetime] NOT NULL,
	[UserP] [varchar](100) NOT NULL,
	[TableP] [varchar](100) NOT NULL,
	[EventP] [varchar](200) NULL,
	[FPrID] [bigint] NOT NULL,
	[ID_Count] [bigint] NOT NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Log_test1](
	[FPrID] [int] IDENTITY(1,1) NOT NULL,
	[id_x] [int] NULL,
	[Name1] [varchar](250) NULL,
	[Name11] [varchar](250) NULL,
	[Name12] [varchar](250) NULL,
	[Name13] [varchar](250) NULL,
	[Name14] [varchar](250) NULL,
	[Name15] [varchar](250) NULL,
	[Name16] [varchar](250) NULL,
	[Name17] [varchar](250) NULL,
	[Name18] [varchar](250) NULL,
	[date_i] [datetime] NULL,
	[date_i1] [datetime] NULL,
	[userP] [varchar](50) NULL
) ON [PRIMARY]
GO

CREATE TRIGGER [dbo].[IU_Test1_Protocol] 
   ON  [dbo].[test1]
  AFTER INSERT,  UPDATE
AS BEGIN
	SET NOCOUNT ON;
----Insert
			IF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted) 
             BEGIN

				INSERT INTO dbo.Log_test1    
				output 	               ----- Получить FPrID  Id_X (счётчики ключи для поиска записи) и вставить в протокол.  
				2, 'test1', inserted.FPrID, inserted.id_x into dbo.Log_Protocol ([TypeP], [TableP],  [FPrID], ID_Count)
				SELECT *	FROM   inserted
			END          
----Update
			IF EXISTS( SELECT * FROM inserted) AND EXISTS (SELECT * FROM deleted)
			 BEGIN
				INSERT INTO dbo.Log_test1    
				output 	               ----- Получить FPrID  Id_X (счётчики ключи для поиска записи)   
				3, 'test1', getdate(), suser_sname(), (app_name()+' ')+host_name(),inserted.FPrID, inserted.id_x into dbo.Log_Protocol ([TypeP], [TableP], [DateP],[UserP],[EventP], [FPrID],ID_Count)
				SELECT d.* FROM   deleted d JOIN inserted i on d.id_x=i.id_x
				 WHERE NOT EXISTS(SELECT i.* INTERSECT SELECT d.*)
			 END			
END
GO

ALTER TABLE [dbo].[test1] ENABLE TRIGGER [IU_Test1_Protocol]
GO
insert into test1([Name1],[Name11] ,[Name12] ,[Name13],[Name14],[Name15] ,[Name16] ,[Name17] ,[Name18] ) VALUES  ('1','1','1','1','1','1','1','1','1')
GO
...
Рейтинг: 0 / 0
20.07.2021, 15:12
    #40084874
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TRIGGER [dbo].[IU_Test1_Protocol] 
   ON  [dbo].[test1]
  AFTER DELETE,  UPDATE
AS BEGIN
	INSERT INTO dbo.Log_test1    
		output 	               ----- Получить FPrID  Id_X (счётчики ключи для поиска записи) и вставить в протокол.  
		2, 'test1', inserted.FPrID, inserted.id_x into dbo.Log_Protocol ([TypeP], [TableP],  [FPrID], ID_Count)
		SELECT *	FROM   deleted

END
...
Рейтинг: 0 / 0
20.07.2021, 23:18
    #40084948
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
RIO08,

авторIF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
И зачем?
...
Рейтинг: 0 / 0
20.07.2021, 23:55
    #40084955
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
Владислав Колосов
RIO08,

авторIF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)

И зачем?

ну так типо проверяется тригер сработал на апдейт или инсерт, что тут такого экстраординарного?


RIO08,
1) универсальные триггеры - зло, сделайте лучше несколько на каждый тип события
2) в начале проверяйте на возможное "ложное срабатывание" (обработка пустого набора) вида
Код: sql
1.
2.
 
if rowcount_big() = 0 return;



немного сэкономите на cpu, если исходный запрос не обрабатывал строки таблицы.

3) меня больше смутило вот это:
Код: sql
1.
2.
SELECT d.* FROM   deleted d JOIN inserted i on d.id_x=i.id_x
				 WHERE NOT EXISTS(SELECT i.* INTERSECT SELECT d.*)



вывести строки "старые данные" в том случае когда значения старых не совпадают с новыми?

почему было не написать через EXCEPT?
...
Рейтинг: 0 / 0
21.07.2021, 08:34
    #40084967
RIO08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
Владислав Колосов
IF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
И зачем?
Делал по примеру... Сейчас изменено на более правильное.
Код: sql
1.
2.
3.
IF NOT EXISTS (SELECT TOP 1 1 FROM deleted) 
.............
else
...
Рейтинг: 0 / 0
21.07.2021, 08:38
    #40084968
RIO08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
felix_ff,

1. Знаю, но надо попробовать.
2. Введу.
3. Переделаю.

Спасибо.
...
Рейтинг: 0 / 0
21.07.2021, 09:07
    #40084969
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
RIO08
Владислав Колосов
IF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
И зачем?
Делал по примеру... Сейчас изменено на более правильное.
Код: sql
1.
2.
3.
IF NOT EXISTS (SELECT TOP 1 1 FROM deleted) 
.............
else


Сделайте два триггера без этих идиотских проверок!
...
Рейтинг: 0 / 0
21.07.2021, 09:29
    #40084972
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
felix_ff
почему было не написать через EXCEPT?
Вариант с INTERSECT с большой вероятностью будет преобразован оптимизатором в скаляр, в отличие от EXCEPT.
...
Рейтинг: 0 / 0
21.07.2021, 10:35
    #40084987
RIO08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
invm
felix_ff
почему было не написать через EXCEPT?
Вариант с INTERSECT с большой вероятностью будет преобразован оптимизатором в скаляр, в отличие от EXCEPT.


Except работает на 25% дольше. Оставил первый вариант.


Так же запись в одну таблицу, без общего протокола работает на 30% быстрее... Придётся оставить одну таблицу, добавив всякую фигню в table_log
...
Рейтинг: 0 / 0
21.07.2021, 10:37
    #40084988
RIO08
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
SQL2008,
По производительности разница незначительная.
...
Рейтинг: 0 / 0
21.07.2021, 11:07
    #40084997
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
RIO08
SQL2008,
По производительности разница незначительная.


Страдалец, "улучшение производительности" - это логику менять.
Ты не понимаешь самого тривиального: INSERT нет смысла журналировать.
Когда осознаешь эту тривиальную истину - увеличишь быстродействие в два раза.
...
Рейтинг: 0 / 0
21.07.2021, 15:13
    #40085109
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
aleks222
RIO08
SQL2008,
По производительности разница незначительная.


Страдалец, "улучшение производительности" - это логику менять.
Ты не понимаешь самого тривиального: INSERT нет смысла журналировать.
Когда осознаешь эту тривиальную истину - увеличишь быстродействие в два раза.
иногда/часто/редко аналитики требуют.
в одной таблице логов сразу видишь всю картину
...
Рейтинг: 0 / 0
21.07.2021, 15:17
    #40085112
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
andreymx
[иногда/часто/редко аналитики требуют.
в одной таблице логов сразу видишь всю картину


Union all у вас там отменили?
...
Рейтинг: 0 / 0
21.07.2021, 15:52
    #40085122
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
aleks222
andreymx
[иногда/часто/редко аналитики требуют.
в одной таблице логов сразу видишь всю картину


Union all у вас там отменили?
пойди им докажи...
...
Рейтинг: 0 / 0
21.07.2021, 16:08
    #40085134
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
andreymx
aleks222
пропущено...


Union all у вас там отменили?
пойди им докажи...

Если все так печально, точно также, достаточно журналировать inserted.
...
Рейтинг: 0 / 0
21.07.2021, 16:16
    #40085139
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли оптимизировать данный тригер?
RIO08
Владислав Колосов
IF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
И зачем?
Делал по примеру... Сейчас изменено на более правильное.
Код: sql
1.
2.
3.
IF NOT EXISTS (SELECT TOP 1 1 FROM deleted) 
.............
else



Суть моего вопроса была - почему просто не создать AFTER INSERT триггер для обработки этого события?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать данный тригер? / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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