본문 바로가기

SQL Server

(81)
INSERT.. SELECT 문에서 대상 테이블에 직접 INSERT 되지 않은 컬럼을 OUTPUT INTO 문으로 담기 던전스트라이커 OBT가 5일 앞으로 다가왔습니다. 개발 기간의 여유도 있었고 함께 작업하는 동료들이 있어 드래곤네스트 때만큼 힘들지 않네요. ^^ 온라인게임 오픈은 인생에서 두 번 할 짓이 못된다고 생각했는데, 여럿이 하니 그렇지도 않은 것 같습니다. 다만, 오픈 직후 찾아올 여러가지 사고와 장애 처리에 대한 압박은 여전합니다. 좀 더 부지런했다면 예상할 수 있는 여러 상황에 대응할 스크립트 들을 많이 만들어 놨을텐데, 그러질 못했다는게 아쉽군요. (주절 주절 주절~) 요 며칠 SSB의 큐 활성화 SP를 만지작 거렸는데, 그 과정에서 알게된 팁 하나를 공유할까 합니다. (별건 아니지만...) 작업하다 보니 이런 상황이 생겼습니다. - S 테이블에는 (a, b) 컬럼이 있습니다. a b 10 100 20 ..
테이블의 파일 그룹 변경하기 오늘은 테이블의 파일 그룹을 변경하는 얘기를 해볼까 합니다. 드래곤네스트 DB를 설계했을 때, 게임 DB의 파일 그룹은 PRIMARY, FGData, FGIndex 이렇게 3개를 사용했습니다. 각각의 파일 그룹은 아래와 같은 용도였는데요. - 힙과 클러스터드 인덱스는 FGData - 넌클러스터드 인덱스는 FGIndex - 게임 로그 테이블은 PRIMARY 다만.. 서버의 물리적 디스크 숫자가 제한되어 있어서 FGData와 FGIndex는 같은 볼륨에 있어야 했고, 게임 로그를 적재하던 PRIMARY 파일 그룹만 별도의 볼륨에 넣을 수 있었습니다. 그래서 이번 던전스트라이커 DB를 설계할 때는 파일 그룹을 나누지 않았습니다. 퍼블리셔가 제한하는 물리적 디스크 숫자의 한계는 여전할테고, 게임 로그는 서비스 ..
스칼라 사용자 정의 함수를 더 빠르게 동작하도록 하는 방법 어제 아래와 같은 제목의 글을 뉴스레터를 통해 접했습니다. 좋은 글이라 소개합니다. How to Make Scalar UDFs Run Faster http://www.sqlservercentral.com/articles/T-SQL/91724/ 위 링크를 통해 원문의 글을 읽어 보셔도 되고, 제 나름의 생각과 경험으로 각색한 아래 글을 읽어보셔도 되겠습니다. ^^ 여러분은 User Defined Function을 실무에 사용하고 계신가요? UDF가 가지는 가장 큰 이점은 "캡슐화"라고 생각합니다. 작성하는 SQL문에 반복적으로 나타나는 복잡한 구문을 하나의 기능으로 분리해 내는 것은.. 코드가 간결해지고 무결성 유지에도 도움이 되기 때문이죠. 하지만, 성능 문제가 늘 발목을 잡아 DBA 중 UDF의 사용을..
문자열 Split 하기 - 두번째 이야기 서비스 브로커를 조금 더 파야하는데 [던전 스트라이커] 2차 CBT가 코 앞이라 여유가 없군요. 각설하고 바로 오늘의 주제(?)로 넘어가겠습니다. SP에서 배열 형태의 인자를 입력 받을 때 , (comma)와 같은 구분자를 사용한 문자열로 입력 받은 후 SP안에서 테이블로 변환해 사용하는 방법이 종종 사용됩니다. 이 과정에서 UDF를 사용할 수 있는데요. 제가 사용하던 함수는 아래 포스트에서 언급한 바가 있습니다. XML을 사용하여 문자열 Split 하기 (2009/07/10 11:36) - 1 ~ 10,000 까지의 정수가 INSERT되어 있는 Tally를 참조하는 방식의 IF_Split() 함수 - 전달받은 문자열을 REPLACE() 함수를 사용하여 XML 형식으로 변경한 후 XQuery를 사용하는 ..
[Service Broker] 성능 최적화 - 150 Trick 이전 글의 소스를 유심히 살펴보셨다면 아래 테이블에서 [_150TrickEnableFlag] 컬럼이 어떤 역할을 하는지 알고 계실 것 같습니다. 123456-- Dialog Pool 설정 테이블 생성CREATE TABLE dbo.DialogPoolConfig ( _150TrickEnableFlag bit NOT NULL, DialogCount int NOT NULL);GOColored by Color Scriptercs [P_StartUp_CreateDialogs]의 내용은 아래와 같았죠. 12345678910111213141516171819202122232425262728293031CREATE PROCEDURE dbo.P_StartUp_CreateDialogsASSET NOCOUNT ON;SET XAC..
[Service Broker] 성능 최적화 - 기본편 SSB 최적화는 여러 면에서 바라볼 수 있습니다. 지금부터 하나씩 살펴보겠습니다. 1. 스토리지 구성 - [PRIMARY] 파일그룹 분리 SQL Server에서 스토리지 구성의 기본 원칙은 데이터파일과 트랜잭션 로그 파일을 물리적으로 분리된 디스크 볼륨에 위치시키는 것입니다. 그런데, SSB의 TRANSMISSION QUEUE는 [PRIMARY] 파일그룹 안에 있는 internal 테이블을 사용합니다. 따라서 주고 받는 메시지가 많으면 많을 수록 *.mdf 파일에 대한 I/O가 증가하게 됩니다. 즉, SSB를 사용하여 대량 메시지를 전송하는 시스템이라면 사용자 데이터를 별도의 파일 그룹에 저장하고 *.mdf 파일과 *.ndf 파일을 물리적으로 분리된 디스크 볼륨에 위치시켜야 합니다. tempdb의 경우 ..
[Service Broker] 인증서를 사용한 인스턴스 간의 대화 BOL의 자습서를 마치셨다면 인증서를 사용하는 방법을 맛 보셨으리라 생각합니다. 아마 인증서를 SERVICE 개체에 매핑하는 것을 보셨을텐데요. SSB에서 인증서를 사용할 수 있는 곳이 하나 더 있습니다. 그것은 END POINT의 인증 방식으로 Windows 인증 대신 인증서를 선택하는 것이죠. 실제 환경에서 Windows 인증을 사용하기 어려운 경우가 존재하기 때문에, 인증서를 사용하는 것을 권해드리고 싶습니다. 이번 글에서는 END POINT의 인증 방식으로 CERTIFICATE를 사용하는 방법과 함께.. 인스턴스 간의 대화에 필요한 SSB 개체를 하나 하나 살펴보겠습니다. (스크립트와 주석으로 대부분의 설명을 대신합니다. 꼼꼼히 읽어 주세요.) 사전 준비 - 2개의 SQL Server 인스턴스를 ..
[Service Broker] 기본 개념 익히기 Service Broker는 SQL Server와 SQL Server 사이에 메시지를 주고 받는 기능입니다. 이때 메시지를 전송하는 쪽을 INITIATOR, 수신하는 쪽을 TARGET이라고 부릅니다. 1. INITIATOR와 TARGET이 모두 하나의 데이터베이스일 수도 있고 2. INITIATOR와 TARGET이 하나의 인스턴스에 존재하는 서로 분리된 데이터베이스 일수도 있고 3. INITIATOR와 TARGET이 서로 분리된 인스턴스일 수도 있습니다. 아마 대부분의 실무 레벨에서는 3항의 구성이 적용되리라 생각합니다. 그럼에도 1, 2항의 구성이 가능하다는 것에 감사할 수 있는데요. 처음 Service Broker를 접하는 단계에서 개념을 잡을 때, 1항과 2항의 단순한 구성이 도움이 되기 때문입니다..