powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Можно ли оптимизировать данный тригер?
16 сообщений из 16, страница 1 из 1
Можно ли оптимизировать данный тригер?
    #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
Можно ли оптимизировать данный тригер?
    #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
Можно ли оптимизировать данный тригер?
    #40084948
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RIO08,

авторIF EXISTS( SELECT * FROM inserted) AND NOT EXISTS (SELECT * FROM deleted)
И зачем?
...
Рейтинг: 0 / 0
Можно ли оптимизировать данный тригер?
    #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
Можно ли оптимизировать данный тригер?
    #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
Можно ли оптимизировать данный тригер?
    #40084968
RIO08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

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

Спасибо.
...
Рейтинг: 0 / 0
Можно ли оптимизировать данный тригер?
    #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
Можно ли оптимизировать данный тригер?
    #40084972
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff
почему было не написать через EXCEPT?
Вариант с INTERSECT с большой вероятностью будет преобразован оптимизатором в скаляр, в отличие от EXCEPT.
...
Рейтинг: 0 / 0
Можно ли оптимизировать данный тригер?
    #40084987
RIO08
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
felix_ff
почему было не написать через EXCEPT?
Вариант с INTERSECT с большой вероятностью будет преобразован оптимизатором в скаляр, в отличие от EXCEPT.


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


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


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


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


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


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


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

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


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