본문 바로가기

SQL Server/SQL Server Tip & Tech

Change Tracking [SQL Server 2008]

변경이 잦지 않은 대용량 테이블의 데이터 또는 데이터베이스에 비교적 큰 부하가 걸리는 Query의 결과셋을 미들웨어 서버의 메모리에 캐시함으로써, 데이터베이스의 부하를 줄일 수 있습니다.

이런 미들웨어 서버를 만들 때 가장 신경 쓰이는 부분은 "데이터베이스에서 데이터가 변경되었는지 여부를 어떻게 판단할 것인가?" 인데, 보통 이런 방법이 사용됩니다.

- 변경이 발생할 때마다 Trigger를 사용하여 별도의 테이블에 변경을 기록한다. 미들웨어 서버는 추가 테이블을 확인.
=> 개인적으론 잘만든 Trigger는 나쁘게 생각하지 않지만, 그래도 Trigger는 보통 지양되는 경향이 있습니다. 추가 테이블을 사용해야한다는 것도 조금 걸리는 부분.

- timestamp열을 추가하고 변경이 발생하면 timestamp열의 값을 update한다. 미들웨어 서버는 캐시된 timestamp열을 비교.
=> 미들웨어에 캐시된 데이터와의 동기 여부를 확인하기 위해 테이블의 레이아웃마저 변경해야하다니, DBA는 슬픕니다. ㅠㅠ

- 미들웨서 서버를 통해 데이터를 변경한다.
=> 성능은 좋습니다. 하지만, 만들기가 까다롭습니다. dependency도 다른 방식에 비해 강한 것도 단점이라면 단점.


SQL Server 2008 부터는 CHANGE_TRACKING 옵션을 사용할 수 있습니다.

먼저 데이터베이스 레벨에서 change tracking 기능을 사용 가능하도록 설정합니다.

ALTER DATABASE [데이터베이스 이름]
SET CHANGE_TRACKING = ON (AUTO_CLEANUP = ON, CHANGE_RETENTION = 8 hours)



그리고, 데이터 갱신 여부를 확인해야하는 테이블을 아래와 같이 설정합니다.

ALTER TABLE [테이블 이름]
ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON)


단, 테이블에 PK가 존재해야한다는군요. (이후 변경된 PK컬럼값만 조회할 수 있습니다.)


이제 change tracking이 설정된 테이블에 대해 INSERT/UPDATE/DELETE문을 실행하면, DMV를 조회하여 쉽게 변경 여부를 확인할 수 있습니다.

EXEC ('SELECT * FROM sys.change_tracking_' + CAST(OBJECT_ID(N'테이블 이름', 'U') AS varchar(10)));

SELECT * FROM CHANGETABLE(CHANGES 테이블 이름, NULL) S


출처 : http://www.databasejournal.com/features/mssql/article.php/3824196/Introducing-Change-Tracking-in-SQL-Server-2008.htm