본문 바로가기

SQL

(39)
About Sequel SAFE 배경 데이터베이스 형상 관리란, 데이테베이스를 구성하는 각 객체 - Table, View, Index, Stored Procedure, Function, Trigger, etc - 와 데이터베이스 자체에 대한 버전 관리를 기반으로 변경 사항을 체계적으로 추적하고 통제하는 것입니다. 하지만 MSA (Micro Service Architecture)를 지향하는 현재에도 데이터베이스를 독립적인 배포의 대상이 아닌 백엔드 시스템의 일부로 보는 경향이 짙은 것 같습니다. 하지만, 프론트엔드나 백엔드처럼 데이터베이스 역시 별도의 형상 관리가 가능합니다. 데이터베이스를 형상 관리한다면 배포 역시 체계적이 됩니다. 즉, 더 이상 Diff. 도구로 개발 DB와 프로덕트 DB의 차이를 찾아 마이그레이션 스크립트를 작성할 ..
[MySQL/Stored Procedure] 명명 규칙 Stored Procedure 명명 규칙접두어 usp_ 를 사용한다.SP의 이름을 구성하는 각각의 단어를 underscore 로 연결하는 snake case 를 사용한다.특정 테이블에 대한 단순 CRUD 작업인 경우, 각각 아래와 같은 이름 규칙을 사용한다.CREATEusp_add_{테이블 이름}RETRIEVEusp_get_{테이블 이름} / 단일 행을 반환하는 경우usp_get_list_{테이블 이름} / 여러 행을 반환하는 경우UPDATEusp_mod_{테이블 이름}DELETEusp_del_{테이블 이름}SP가 특정 비즈니스 로직을 처리하는 경우, 적절한 동사와 명사의 조합을 사용한다.(예) usp_validate_applicant, usp_check_brand_user, ...local variab..
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의 경우 ..