본문 바로가기

전체 글

(101)
[MySQL] Materialized Path를 사용한 계층형 모델 Graph 구조 중 가장 단순하면서 흔히 사용되는 것이 Hierarchy, 즉 계층형 구조입니다. 이런 곳에 사용하죠. 계층형 게시판 카테고리 조직도 폴더 Tree 추천인 Tree 먼저 기본 설계를 설명하고 다음으로 Materialized Path를 어떻게 적용할 수 있는 지 알아보겠습니다. 1. 계층형 설계의 기본 : Adjacency List 자신의 매니저를 `employee` 테이블에서 재귀 참조하는 예입니다. 정규화된 간결한 구조인데요. 이런 계층형 설계를 Adjacency List 라고 합니다. 그럼 테이블을 생성하고, 테스트 데이터를 입력해 봅니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE DATABASE `graph_test` DEFAULT CHARACTER S..
[MySQL] 테이블 레이아웃 복사 원본 테이블의 데이터는 제외하고 레이아웃만 그대로 복사하여 새로운 테이블을 만들 일이 종종 있습니다. MySQL에서는 어떻게 하는 지 알아봤습니다. 원본 테이블 12345678CREATE TABLE table_copy ( id int NOT NULL AUTO_INCREMENT, address varchar(255) NOT NULL, address_type tinyint UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (id)); INSERT table_copy (address) VALUES ('test');cs 방법 1 : CREATE TABLE ~ AS SELECT ~ LIMIT 0; 123456789101112131415CREATE TABLE table_copy_1ASSELE..
[MySQL] 날짜 함수 MySQL의 날짜 함수를 정리해 봤습니다. MS-SQL을 사용할 때와 비교하면.. 장점 : 직접 구현해야했던 동작까지 바로 제공해주는 다양한 함수단점 : 같은 동작을 하는 함수가 중복하여 존재한다. 이름만 다르거나, 인자의 순서 또는 형식이 다르거나... 프로젝트 초기에 coding convention을 정하고 작성하는 것은 당연한 일이겠지만, MySQL을 사용한다면 함수에 대해서도 어떤 동작에 어떤 함수를 쓰기로 미리 약속 하는 것이 좋을 것 같습니다. 예를들면 "날짜를 더하고 뺄때 TIMESTAMPADD()만 사용하기로 합니다" 와 같은 것!! 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484..
MySQL의 Stored Procedure 특성 MS-SQL을 오래 다뤄 본 사람이라면 Stored Procedure는 옵션이 아닌 필수라는 점에 동의할 겁니다. 하지만 MySQL에서 Stored Procedure를 사용하는 것은, MS-SQL에서 만큼 보편적이지 않습니다. 여러가지 이유가 있겠지만 성능 이슈도 한 몫한다고 볼 수 있는데요. 아래 글을 읽어보니 어느 정도 납득이 되더군요. http://www.joinfu.com/2010/05/mysql-stored-procedures-aint-all-that/ 위 글은 MySQL 5.5 기준으로 씌여졌지만, 5.6과 5.7에서도 별 다르지 않습니다. 요약에 앞 서, MS-SQL 개발자들이 SP를 선호하고 실제로 SP의 사용이 권장되는 이유가 무엇일까요? 데이터를 처리하는 하나의 추상화된 레이어를 제공한..
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를 사용하는 ..