트리거란
특정 이벤트가 발생하였을 때 동작합니다.
특정 이벤트에 포함되는지 검사하기 위해 쿼리 수행마다 트리거를 확인하는 작업이 필요합니다.
트리거가 미치는 성능 테스트
트리거 생성 전 테스트
트리거를 생성하지 않고 trg_table 을 생성 한 후 20,000 건을 INSERT 합니다.
SET NOCOUNT ON
CREATE TABLE trg_table (C1 INT, C2 VARCHAR(500))
GO
DECLARE @ST DATETIME
DECLARE @ET DATETIME
DECLARE @I INT
SET @I = 1
SET @ST = GETDATE()
WHILE @I <= 20000
BEGIN
INSERT INTO trg_table (C1, C2) VALUES (@I, 'Trg Test')
SET @I = @I + 1
END
SET @ET = GETDATE()
SELECT DATEDIFF(ms, @ST, @ET) AS TRIGGER_NO
20,000 건을 넣는데 총 7.076 초가 소요되었습니다.
TRIGGER_NO
7076
트리거 생성 후 테스트
트리거를 생성한 후 trg_table 을 생성 한 후 20,000 건을 INSERT 합니다.
트리거에서 소요되는 시간을 최소화 하기 위해 DELAY 0 초를 작성하였습니다.
SET NOCOUNT ON
CREATE TABLE trg_table (C1 INT, C2 VARCHAR(500))
GO
CREATE TRIGGER dbo.trg_Test ON dbo.trg_table
AFTER INSERT
AS
BEGIN
WAITFOR DELAY '00:00:00'
END
GO
DECLARE @ST DATETIME
DECLARE @ET DATETIME
DECLARE @I INT
SET @I = 1
SET @ST = GETDATE()
WHILE @I <= 20000
BEGIN
INSERT INTO trg_table (C1, C2) VALUES (@I, 'Trg Test')
SET @I = @I + 1
END
SET @ET = GETDATE()
SELECT DATEDIFF(ms, @ST, @ET) AS TRIGGER_YES
20,000 건을 넣는데 총 7.513 초가 소요되었습니다.
TRIGGER_YES
7513
결론
이번 테스트에서는 트리거 유무에 따라 20,000 건에서 0.5 초가 소요되었습니다.
트리거를 아무 작업을 하지 않더라도 0.5 초나 더 소요가 된 것입니다.
만약 트리거 내에서 어떤 작업을 한다면, 사용자가 응답을 받기 위해서는 지금보다 더 많은 시간을 기다려야 할 것입니다.
쓰지 말라는 것이 아닙니다. (기능은 쓰라고 만들어 놓은 것이기 때문에!)
단지, 쓸때 예상 호출 수, 트리거로 인해 지연되는 시간등을 계산하여 적용 할 것인지 아닐것인지를 판단해야 합니다.
'Database > DBA 의 개인생각' 카테고리의 다른 글
[DBA] 인덱스 생성 시 체크해야 할 리스트 (0) | 2019.12.07 |
---|---|
[DBA] 테이블 생성 시 체크해야 할 리스트 (1) | 2019.12.07 |
[DBA] 게시판 페이징 처리하는 방법 (Scan VS Seek) (0) | 2019.05.02 |
[DBA] COUNT(*) 안쓰고 테이블 총 레코드 조회하는 법 생각해보기 (0) | 2019.02.12 |
[DBA] DBA 란, DBA 가 하는일 알아보기 (0) | 2018.11.25 |