오늘은 테이블의 파일 그룹을 변경하는 얘기를 해볼까 합니다.
드래곤네스트 DB를 설계했을 때, 게임 DB의 파일 그룹은 PRIMARY, FGData, FGIndex 이렇게 3개를 사용했습니다.
각각의 파일 그룹은 아래와 같은 용도였는데요.
- 힙과 클러스터드 인덱스는 FGData
- 넌클러스터드 인덱스는 FGIndex
- 게임 로그 테이블은 PRIMARY
다만.. 서버의 물리적 디스크 숫자가 제한되어 있어서 FGData와 FGIndex는 같은 볼륨에 있어야 했고, 게임 로그를 적재하던 PRIMARY 파일 그룹만 별도의 볼륨에 넣을 수 있었습니다.
그래서 이번 던전스트라이커 DB를 설계할 때는 파일 그룹을 나누지 않았습니다.
퍼블리셔가 제한하는 물리적 디스크 숫자의 한계는 여전할테고, 게임 로그는 서비스 브로커를 통해 전송하기 때문에 tempdb만 별도의 디스크를 할당하면 된다는 판단이었죠.
당시에는 서비스 브로커를 통해 메세지를 전송할때 I/O 부담이 tempdb에만 생기는 것으로 알았고, 결국 던전스트라이커 2차 CBT를 진행하면서 mdf 파일에대한 write I/O stall이 거의 200ms에 육박하는 현상을 지켜봐야 했습니다. Orz
다행히 DB M/W에의해 잘 완충되어서 서비스 장애로 이어지진 않았지만 OBT 전에 수정해야하는 문제죠.
원인은 서비스 브로커에 의해 전송되는 메세지가 transferqueue에 적재되는데, 이때 사용되는 internal 테이블이 PRIMARY 파일 그룹을 사용하기 때문이었습니다.
internal 테이블이 사용하는 파일 그룹을 분리할 수 있다면 좋겠지만 그렇게 할 방법은 없어 보입니다.
결론은 사용자 데이터와 인덱스를 별도의 파일 그룹으로 옮기고 디스크 분리
하는 김에 예전처럼 데이터와 인덱스용으로 ndf 파일 2개를 추가하기로 했습니다.
방법은..
1. Foreign Key 삭제
2. 넌 클러스터드 타입의 Primary Key와 인덱스 삭제
3. 클러스터드 타입의 Primary Key와 인덱스 삭제
4. FGData 파일 그룹에 클러스터드 타입의 Primary Key와 인덱스 생성
5. FGIndex 파일 그룹에 넌 클러스터드 타입의 Primary Key와 인덱스 생성
6. Foreign Key 생성
여러 수단이 있겠지만, 저는 카탈로그 뷰의 메타 데이터를 가져와서 동적으로 시퀄을 뽑아주도록 스크립트를 짜봤습니다.
스크립트의 내용은 간단합니다.
- 파일 그룹 2개를 추가한다. (주석 처리되어 있음)
- 하나는 클러스터드 인덱스를 적재하도록 한다.
- 다른 하나는 넌 클러스터드 인덱스를 적재하도록 한다.
- 힙은 따로 처리하지 않았습니다. (제 DB에는 힙 테이블이 없어서..)
Change_Filegroup_Of_All_Tables.sql
위 스크립트를 SSMS에서 Open하고, Ctrl+Shift+M (또는 Alt+Q, S) 단축키로 아래 창을 띄운 후, 각 항목에 적절한 값을 넣고 실행하면 됩니다.
'SQL Server > SQL Server Tip & Tech' 카테고리의 다른 글
INSERT.. SELECT 문에서 대상 테이블에 직접 INSERT 되지 않은 컬럼을 OUTPUT INTO 문으로 담기 (0) | 2013.05.10 |
---|---|
스칼라 사용자 정의 함수를 더 빠르게 동작하도록 하는 방법 (1) | 2012.08.02 |
문자열 Split 하기 - 두번째 이야기 (2) | 2012.07.05 |
SSMS 에러 - Cannot show requested dialog. There is no row at position 0. (0) | 2011.08.30 |
SSMS에서 Ctrl-F, Ctrl-H 단축키가 동작하지 않을 때 (0) | 2011.07.26 |