Background Image
조회 수 37613 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

 

인덱스, 아는 만큼 보인다!
DBMS 개발자가 전하는 인덱스 활용 노하우

 

고성능 서비스를 구축하기 위한 DB 쿼리 튜닝의 핵심은 인덱스를 얼마나 잘 활용하는가에 달려 있다. 지난 3년 동안 CUBRID를 NHN 내/외부 서비스에 적용하면서 의외로 많은 개발자들이 DB 인덱스에 대해 “잘” 알지 못하고 “잘” 활용하지 못한다는 것을 발견하였다. 본 기고문에서는 6월 30일에 출시된 CUBRID 2008 R4.0에 적용된 다양한 인덱스 기법을 중심으로 인덱스 구조와 인덱스 활용 노하우를 쉽게 설명하고자 한다. 단, MySQL, MS-SQL, Oracle 등 다른 DBMS에서도 이와 동일/유사한 인덱스 기법이 적용되어 있으므로 본 기고문에서 소개할 인덱스 활용 노하우가 CUBRID에 국한되지 않는다는 점을 강조하고 싶다.

 

* 본 게시글은 월간 마이크로소프트웨어 8월호에 게재된 내용의 원작입니다.

   월간 마이크로소프트웨어에서는 약간 내용이 줄어서 게재된 관계로 본 게시글과 차이가 있을 수 있습니다.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
강동완  | NHN Business Platform 서비스 플랫폼 개발 센터 내 DBMS 개발랩 소속이다. CUBRID 차기 버전(코드명: Apricot)에 오라클의 Index Skip Scan 기법 (MySQL에서는 Loose Index Scan이라고 함)과 Function Index, MS-SQL Server의 Include Index 등 다양한 인덱스 활용 최적화 기법을 적용하기 위하여 개발에 몰두하고 있다.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

인덱스 구조와 스캔 방식을 이해하기


 

CUBRID의 인덱스는 B+-Tree 를 이용하여 인덱스를 구현한다. B+-Tree 는 B-Tree 의 한 종류로 일반적인 B-Tree 와는 달리 데이터 포인터들을 리프(Leaf) 노드에만 저장한다. 리프 노드의 상위 레벨인 넌리프(Non-Leaf) 노드는 전형적인 B-Tree 로 구성되는데, 리프 노드를 빠르게 찾기 위한 인덱스 역할을 한다. 리프 노드에는 키와 키에 대응하는 데이터의 포인터가 저장되어 있다. 리프 노드는 링크드 리스트로 연결되어 있기 때문에 범위 검색과 같은 순차 처리를 편하게 해준다. 그림 1 은 B+-Tree 의 전형적인 구조를 보여준다.

 

pic1.jpg


그림 1 B+-Tree 구조


B+-Tree 의 리프 노드는 서로 연결되어 있어 순차 처리가 가능하기 때문에 범위를 검색하는데 유리하다. 테이블은 처음부터 끝까지 모든 레코드를 읽어야 완전한 결과 집합을 얻을 수 있지만, 인덱스는 키 컬럼 순으로 정렬되어 있기 때문에 특정 위치에서 검색을 시작해서 검색 조건이 일치하지 않는 값을 만나는 순간 멈출 수 있다. 이것을 인덱스 범위 스캔(Index Range Scan)이라고 부른다. CUBRID는 범위 스캔을 B+-Tree 검색의 기본 연산으로 제공한다. 범위 스캔을 위해서는 두 개의 키가 필요한데, 범위의 양 끝을 표현하는 하위 키와 상위 키가 그것이다.

인덱스 범위 스캔은 두 단계로 진행된다. 첫 번째 단계에서는 루트에서부터 트리를 순회하여 리프 노드에서 하위 키를 찾아낸다. 두 번째 단계에서는 첫 번째 단계에서 찾은 키에서부터 상위 키까지 순차적으로 레코드를 읽어 처리한다. 상위 키가 현재 노드에서 발견되지 않으면 다음 노드를 읽어 상위 키를 가진 노드까지 검색을 계속해 나간다. 상위 키까지 순차 검색이 끝나면 전체 범위 검색이 완료된다.
두 번째 단계에서 상위 키까지 찾아가는 과정은 레코드에서 키를 읽어와 상위 키와 비교하는 과정의 연속이다. 상위 키가 최대 키이면 현재 노드의 키부터 마지막 노드까지 모두 검색 결과에 포함되기 때문에 비교 연산을 할 필요가 없어져 검색의 성능이 좋아진다. 이를 위해 옵티마이저는 입력된 쿼리를 재작성(rewrite)하며, CUBRID는 특정 키를 찾는 검색도 범위 검색으로 변환하여 수행한다. 이런 경우에는 하위 키와 상위 키 모두를 찾고자 하는 키로 동일하게 설정한다.

 

인덱스 스캔을 통한 질의 처리 과정을 이해하기


CREATE TABLE tbl (a INT NOT NULL, b STRING, c BIGINT);
CREATE INDEX idx ON tbl (a, b);

그림 2는 CUBRID에서 위의 구문으로 테이블과 인덱스를 생성하고 데이터를 입력한 경우, 인덱스 리프 노드와 테이블 데이터의 관계를 나타낸 그림이다. 왼쪽 인덱스 리프 노드에는 인덱스 키와 키에 대응되는 OID(레코드의 물리적 주소 값)가 저장되어 있다.

 

pic2.jpg  
그림 2 인덱스 리프 노드와 테이블 데이터의 관계

 

SELECT * FROM tbl WHERE a > 1 AND a < 5 AND b < ‘K’ AND c > 10000 ORDER BY b;

 

위와 같은 SELECT질의가 주어졌을 때 WHERE 절에 있는 검색 조건은 아래의 3가지로 나눌 수 있다.
 Key Range: 인덱스 스캔 범위로 활용되는 조건이다. (a>1 and a < 5)
 Key Filter: Key Range에 포함될 수 없지만 인덱스 키로 처리 가능한 조건이다. (b < ‘K’)
 Data Filter: 인덱스를 사용할 수 없는 조건이다. 테이블 데이터를 검색하는데 적용된다. (c > 10000)
CUBRID의 질의 처리 과정은 다음과 같다.
1) 인덱스 스캔인 경우 먼저 Key Range와 Key Filter를 적용하여 조건에 부합하는 OID 리스트를 만들어 낸다. 이 과정은 Key Range의 시작부터 끝까지 계속된다.
2) OID를 이용해 데이터 페이지에서 해당 레코드를 읽어 Data Filter를 적용하거나 SELECT 리스트에 기술된 컬럼 값을 읽어와 결과를 저장하는 임시 페이지에 기록한다.
3) ORDER BY나 GROUP BY 절이 있으면 임시 페이지에 저장된 레코드들을 정렬하여 최종 결과를 생성한다. 그림 3은 위의 SELECT 질의가 처리되는 1), 2), 3) 과정을 보여 준다.

 

 

pic3.jpg


 그림 3 인덱스 및 테이블 데이터 검색을 통한 질의 처리 과정

 

인덱스 사용 시 이런 점을 주의하자


옵티마이저가 인덱스를 사용하도록 하기 위해서는 WHERE 절에 Range 조건이 있어야 한다. Range 조건은 값의 비교조건, 즉 크다, 작다, 크거나 같다, 작거나 같다, 같다와 같은 비교문으로 기술된다. 만약 Range 조건이 없다면 옵티마이저는 테이블 순차 스캔을 시도할 것이다.
또한, WHERE 절에 인덱스 키의 첫 번째 컬럼이 사용되어야만 인덱스 스캔을 수행한다. 인덱스가 여러 컬럼으로 조합되어 있는 경우 많은 사람들이 이중 한가지 컬럼만을 사용하더라도 비교가 가능하다고 생각하는 경우가 있는데, 그것은 잘못된 생각이다. 첫 번째가 없는 상태에서는 두 번째가 정렬된 상태라고 할 수 없기 때문에 범위를 정의할 수 없다. 따라서 반드시 첫 번째 컬럼이 조건에 있어야 하며, 뒤의 컬럼들은 없어도 상관없다.
인덱스는 값의 대소 비교를 통해 트리가 구성되어 있다. 따라서 값의 대소 비교가 아닌 것은 B+-Tree를 사용해서 값을 찾을 수 없다. <>, != 와 같이 부정형 조건이나 NULL 비교는 인덱스를 사용할 수 없다. 인덱스의 첫 번째 컬럼을 조건절에서 가공하는 경우도 인덱스를 사용할 수 없다. 다음은 인덱스를 사용하지 못하는 질의문의 예이다.

 

SELECT * FROM student WHERE grade <> 'A';
SELECT name, email_addr FROM student WHERE email_addr IS NOT NULL;
SELECT student_id FROM record WHERE substring(yymm, 1, 4) = ‘1997’;

 

인덱스 활용 최적화: 디스크 I/O를 최소화하는 것이 튜닝의 핵심이다!


B+-Tree는 특성상 어떤 리프 페이지든 접근하는데 거의 동일한 비용이 든다. B+-Tree를 사용하는데 가장 큰 비용이 드는 부분은 Key Range의 시작부터 끝까지 인덱스 리프 노드들을 따라 스캔하는 것과 이와 대응되는 테이블 데이터를 스캔하는 것이다.


CUBRID의 I/O는 페이지 단위로 이루어진다. 이것은 하나의 레코드에서 하나의 컬럼만 읽으려 해도 레코드가 속한 페이지 전체를 디스크로부터 읽어온다는 것을 뜻한다. 따라서, 질의 성능을 좌우하는 가장 중요한 성능 지표는 I/O를 수행하는 페이지 개수이며, 이는 옵티마이저의 판단에 가장 큰 영향을 미친다. 옵티마이저가 인덱스를 읽을지, 테이블을 읽을지 결정하는데 있어 가장 중요한 판단 기준은 읽어야 할 레코드가 아니라 읽어야 할 페이지 개수인 것이다.


디스크 I/O는 메모리 액세스에 비해서 비용이 아주 크다. 질의 수행에 필요한 모든 데이터 페이지와 인덱스 페이지를 DB 버퍼에 올려놓고 처리할 수 있다면 좋겠지만 그러기에는 한계가 있다. 결국 디스크 I/O를 최소화 하고 대부분의 연산을 DB 버퍼에서 처리할 수 있도록 질의 처리 과정에서 액세스하는 페이지 수를 최소화시키는 것이 튜닝의 핵심이다. 액세스하는 페이지 수가 적으면 자연스럽게 물리적으로 디스크에서 읽어야 할 페이지 수도 줄어들기 때문에 DB 버퍼 히트율(DB buffer hit ratio)이 높아져서 데이터베이스의 전체적인 성능이 높아지게 된다. 그럼 지금부터 인덱스 스캔 과정에서 액세스해야 할 페이지 수를 줄일 수 있는 기법들에 대해 알아보자.

 

최적화 기법 1. Key Filter 활용


앞서 설명한 바와 같이 Key Filter는 Key Range에는 포함될 수 없지만 인덱스 키로 처리 가능한 조건이다. 이러한 Key Filter가 WHERE 조건절에 포함되면 인덱스 스캔 중에 데이터 페이지에 접근하는 횟수를 줄일 수 있다. 데이터 페이지를 읽는 것은 랜덤 액세스 이기 때문에 인덱스 페이지를 스캔하는 것보다 많은 비용이 든다. 따라서 WHERE절에 Key Filter를 주는 것이 성능에 유리하다.  또한, Data Filter가 Key Filter로 적용될 수 있도록 인덱스에 컬럼을 추가하는 것도 방법이 될 수 있다. 예를 들어 user 테이블에 (groupid, name)으로 구성된 인덱스 idx_1이 있는 상태에서 아래 질의를 수행한다고 가정해 보자.

 

SELECT * FROM user WHERE groupid = 10 AND age > 40;


groupid=10인 조건을 만족하는 레코드가 100건이고 그 중 age>40인 레코드가 10건이라고 하면, 인덱스 스캔으로 100건의 OID를 가져온 후, 최악의 경우 데이터 페이지로 100회의 액세스를 수행할 것이다. 그러나, idx_1 인덱스에 age 컬럼을 추가하여 (groupid, name, age)로 만들면 age > 40 조건이 Key Filter 조건으로 처리되어 인덱스 스캔으로 10건의 OID만 추출할 수 있다.

 

최적화 기법 2. 커버링 인덱스


만약 사용되는 인덱스 내에서 SELECT 질의에 대한 결과를 모두 얻을 수 있는 상황이라면 데이터 페이지에 저장되어 있는 레코드를 읽어오지 않아도 인덱스 키의 값으로만 결과를 만들어 낼 수 있다. MS-SQL Server 에서는 이와 같이 인덱스가 하나의 질의를 모두 “커버”한 경우에 대해서 “커버링 인덱스”라고 한다. CUBRID 2008 R4.0에도 커버링 인덱스가 도입되었다.

 

SELECT a, b FROM tbl WHERE a > 1 AND a < 5 AND b < ‘K’ ORDER BY b;

 

위의 질의는 커버링 인덱스가 적용될 수 있다. 질의에 사용된 컬럼은 a, b 뿐이고 모두 인덱스 컬럼이기 때문이다. 그림 4를 통해 커버링 인덱스에 의해 질의가 처리되어 테이블 데이터 페이지를 액세스 하는 부분이 없는 것을 확인할 수 있다. 대신 인덱스 스캔 결과로 인덱스 키 값을 그대로 Key Buffer에 저장한 후 이 값을 읽어 최종 결과를 만들어 낸다.


pic4.jpg  
그림 4 커버링 인덱스를 활용한 질의 처리 과정

 

커버링 인덱스는 데이터 페이지를 읽지 않는다는 점, 그리고 해당 질의를 자주 사용하게 되면 인덱스가 DB 버퍼에 캐시되어 있을 가능성이 높다는 점에서 디스크 I/O를 줄이는데 큰 역할을 한다. 따라서 레코드 크기에 비해 인덱스 키의 크기가 작고, 커버링 인덱스를 이용하는 질의가 자주 수행되는 것이 확실하다면, 커버링 인덱스를 사용하여 SELECT 질의 성능을 크게 향상시킬 수 있다.

 

최적화 기법 3. Sort 연산 대체


인덱스 스캔을 통해 생성된 결과 집합은 인덱스 컬럼 순으로 정렬된 상태이므로 ORDER BY, GROUP BY절에 의한 정렬 연산을 생략하도록 질의를 작성할 수 있다. 이를 위해서는 인덱스 컬럼의 순서대로 ORDER BY나 GROUP BY 절에 컬럼이 지정되어야 한다. 단 인덱스 컬럼이 조건절에서 ‘=’ 연산자로 동등 비교되는 경우에는, 해당 컬럼이 ORDER BY나 GROUP BY 절에서 중간에 생략되어도 된다. 그림 5는 인덱스 스캔에 의해 GROUP BY 정렬이 생략되는 질의 처리 과정을 보여 준다.

 

SELECT COUNT(*) FROM tbl WHERE a > 1 AND a < 5 AND b < ‘K’ AND c > 10000 GROUP BY a;



 

pic5.jpg
그림 5 GROUP BY 정렬 최적화된 질의 처리 과정


앞에서 인덱스 스캔을 하기 위해서는 조건절에 인덱스 첫 번째 컬럼이 명시되어야 한다고 설명했다. 하지만 인덱스 컬럼에 NOT NULL 제약 조건이 설정되어 있다면 옵티마이저는 조건절에 인덱스 첫 번째 컬럼이 없더라도 최소 키값과 최대 키값으로 Key Range를 자동으로 추가하여 인덱스 스캔이 가능하도록 최적화한다. 즉, 인덱스 리프 노드의 처음부터 끝까지 스캔하게 되는데, 이를 오라클에서는 인덱스 전체 범위 스캔(Index Full Range Scan) 이라고 부른다.

 

SELECT * FROM tbl WHERE b < ‘K’ ORDER BY a;


이 질의는 옵티마이저에 의해 인덱스 전체 범위 스캔이 수행되는 예이다. CUBRID Manager라는 질의 실행 도구로 해당 질의문의 실행 계획을 확인하면, 그림 6에서처럼 Key Range가 자동으로 추가되어 ORDER BY 정렬 연산이 생략되는 것을 알 수 있다.

 

pic6.jpg
그림 6 옵티마이저에 의해 정렬 최적화된 질의의 실행 계획

 

최적화 기법 4. LIMIT 최적화


LIMIT 절은 질의의 최종 결과 개수를 제한한다. Data Filter가 없는 질의에 LIMIT 절이 있으면 Key Range에 해당하는 키 값 전부를 스캔할 필요 없이 LIMIT 절에 기술된 개수만큼의 결과를 확보하자 마자 스캔을 중단할 수 있다. 이는 Range의 끝까지 스캔하고 나서 결국은 버리게 되는 페이지를 액세스하지 않기 때문에 불필요한 I/O를 제거할 수 있다.

SELECT * FROM tbl WHERE a = 2 AND b < ‘K’ ORDER BY b LIMIT 3;
이 질의는 LIMIT 최적화에 의해 필요한 결과를 얻은 후 인덱스 스캔이 중단되는 예이다. 만약 a = 2인 인덱스 키가 10페이지에 걸쳐 저장되어 있더라도 LIMIT 절에 명시한 3개의 키 값만 스캔하므로 1개의 페이지만 읽게 된다.
 

pic7.jpg
그림 7 LIMIT 최적화된 질의 처리 과정

 

한편, IN 절을 사용한 질의에 대해서도 LIMIT 최적화를 적용할 수 있다. CUBRID는 인덱스 컬럼이 IN 절에 사용되면 Key Range를 IN에 사용된 개수만큼 생성하고, 각각에 대해 인덱스 스캔을 수행한다. 다만, 아래 질의처럼 LIMIT 절에 결과 개수가 명시된 경우, 3번의 인덱스 스캔에 대해 각각 3건의 결과만 획득하고 인덱스 스캔을 중단한다. 즉, 각각의 인덱스 스캔에 대해서 LIMIT 최적화가 적용되는 것이다.

 

SELECT * FROM tbl WHERE a IN (2, 4, 5) AND b < ‘K’ ORDER BY b LIMIT 3;


ORDER BY절은 전체 결과에 대한 정렬을 의미하기 때문에 Key Range가 여러 개이면 각각의 인덱스 스캔 결과를 모아서 다시 정렬을 해야 한다. 하지만 인덱스 스캔의 결과로 정렬을 대체할 수 있는 경우에는 스캔 과정에서 바로 병합(merge)할 수 있다.  CUBRID는 이 과정을 In-Place Sorting 이라고 부른다.
그림 8을 보면서 자세한 설명을 하면, 먼저 첫 번째 range(a = 2 AND b < ‘K’)에 대한 스캔을 통해 3건의 OID를 확보한다. 그 다음 두 번째 range(a = 4 AND b < ‘K’)에 대한 스캔을 시도하는데, 이 range의 첫 번째 키인 (4, ‘DAA’)는 첫 번째 range의 마지막 스캔 키인 (2, ‘CCC’) 보다 b 컬럼의 값이 크기 때문에 바로 스캔을 중단한다. 마찬가지로 다음 세 번째 range인 a = 5 AND b < ‘K’에 대한 스캔에서도 두 번째 키를 읽은 후 바로 스캔을 중단한다. 이처럼 In-Place Sorting 기법은 인덱스 스캔 범위를 더욱 축소하고, 최종 결과에 대한 별도의 정렬을 수행하지 않기 때문에 성능 향상에 많은 도움을 준다.

 

 

 pic8.jpg
그림 8 In-Place Sorting 기법에 의해 최적화된 질의 처리 과정

 

요약 정리


인덱스가 좋다고 해서 인덱스를 많이 만드는 것이 능사가 아니다. 오히려 인덱스 관리 비용이 증가하고 INSERT, UPDATE, DELETE 성능 저하의 원인이 될 수 있다.
DB 튜닝의 핵심은 적절한 수의 인덱스를 생성하고 질의가 이 인덱스들을 활용할 수 있도록 질의를 최적화하는 것이다. 이를 위해서는 DBMS에 구현된 인덱스 구조와 다양한 활용 기법들을 이해하고, 질의 패턴과 사용 빈도, I/O 비용, 저장 공간에 대한 비용을 전체적으로 고려하여야 한다.

 


  1. CMT(CUBRID Migration Tool) 활용

    CMT를 이용하여 데이터 마이그레이션 작업하면서 여러가지의 팁이 있겠지만 4단계에서 유용하게 사용할 수 있는 팁중 PK가 없는 테이블에 대해서 데이터 수행전에 PK 선택하거나 또는 테이블 생성 후 PK 컬럼을 추가하여 데이터 마이그레이션하면 되는 팁을 알려 드리겠습니다. 1) PK가 없는 테이블에 대해 이관전 PK 컬럼 선택 후 데이터를 이관하는 방법 2) PK가 없는 테이블 정보를 그대로 생성하고 데이터를 이관전에 seq 컬럼을 추가하여 그 컬럼에 대해 PK로 만들어 주므로 PK에 대한 재작업이 안해도 되는 방법 위 두가지를 병행하여 데이터 이관 작업을 진행하면 좀 더 쉽게 데이터 이관 작업을 할 수 있다. 1단계 - 원본과 대상 유형을 선택한다. - 다음버튼을 클릭한다. 2단계 - 편집버튼을 클릭하여 "원본 정보"를 등록하여 접속이 되는지 테스트버튼을 클릭하여 확인한다. (연결이름 : 임의로 작성, 호스트 주소 : IP주소, 연결 포트 : 사용하는 접속 포트, 데이터베이스 이름 : SERVICE_NAME, 사용자 이름 : 실제사용자ID, 비밀번호 : 실제비밀번호) - 테스트버튼을 클릭하여 접속이 안되는 경우는 연결포트 또는 데이터베이스 이름, 사용자이름, 비밀번호가 틀리...
    Date2018.12.31 Category제품 여행 By엄기호 Views2402 Votes0
    Read More
  2. No Image

    CUBRID 매니저 가져오기 마법사 유용한 팁!

    CUBRID 매니저 가져오기 마법사 유용한 팁! 다량의 데이터를 엑셀로 작성해서 넣는 경우가 많으실 텐데요 CUBRID 매니저에서 UI로 간단하고 쉽게 데이터를 넣을 수 있습니다. 바로 가져오기라는 기능인데요 가져오기는 스키마, 데이터를 파일로부터 데이터베이스 서버로 import를 하는 기능 입니다. (스키마는 SQL 파일만 지원하며, 데이터는 SQL, CSV, XLS, TXT를 지원합니다.) 가져오기 마법사는 아래의 3단계로 구성되어 있습니다. •가져오기 유형 선택 • 가져오기할 데이터 소스 및 옵션 선택 • 가져오기 옵션 확인 여기서 팁 한가지! XLSX 파일은 엑셀 2007부터 추가된 파일 포맷이며 CUBRID 매니저는 XLSX 파일을 지원하지 않으므로, XLSX 파일을 원본으로 하여 데이터 가져오기 작업을 수행하는 경우 정상적인 데이터 입력을 보장할 수 없습니다. 따라서, XLSX 파일은 "다른 이름으로 저장" 메뉴를 통해 반드시 XLS 파일로 변환한 후에 사용해야 합니다. 그리고 XLS 파일로 저장 시 파일 문자집합을 신경 써 주셔야 합니다. 엑셀 한글 버전에서는 따로 문자집합을 설정 안 할 경우 기본 인코딩이 EUC-KR로 되어 있어 파일의 문자집합 옵션을 맞지 않게 데이터를 가져오...
    Date2018.12.31 Category제품 여행 By강주원 Views2999 Votes0
    Read More
  3. Docker, Kubernetes 환경에서 CUBRID 컨테이너 서비스 해보기

    Docker, Kubernetes 환경에서 CUBRID 컨테이너 서비스 해보기 최근에 여러 기업에서 Docker, Kubernetes를 사용하여 컨테이너로 서비스 하는 사레들을 많이 보았습니다. CUBRID도 컨테이너로 만들어서 Docker, Kubernetes 환경에서 서비스 해보려고 합니다. Docker는 '가장 빨리 만나는 Docker: 클라우드 플랫폼 어디서나 빠르게 배포하고 실행할 수 있는 리눅스 기반 경량화 컨테이너'라는 책으로 처음 접하였습니다. 책을 구매해서 보는 것을 권장드리지만 'http://pyrasis.com/docker.html' 페이지에서 책의 내용을 공개하고 있습니다. 책이 너무 길다면 Slideshare, 'https://www.slideshare.net/pyrasis/docker-fordummies-44424016' 페이지에서 슬라이드로 요약된 내용을 볼 수 있습니다. Docker는 Docker라는 회사에서 OS에서 제공하는 가상화 기술을 사용하여 만든 오픈소스 Container 프로젝트의 결과물입니다. 컨테이너는 호스트에 게스트 환경을 구성한다는 점에서는 가상머신과 비슷하지만 OS를 별도로 설치해 줄 필요가 없고, 호스트와 동일한 성능을 낼 수 있다는 장점이 있습니다. 이외에도 여러가지 장점이 많지만 가장 큰 장점은 배...
    Date2018.12.31 By주영진 Views24257 Votes0
    Read More
  4. No Image

    기술지원 중 자주받는 질문들을 살펴보자 !

    큐브리드 엔지니어로 기술지원을 수행하면서 자주 받는 질문들을 크게 10개 단락으로 나누어 모아 보았습니다. 큐브리드를 사용해주시는 많은 분들에게 작게나마 도움이 되기를 바라는 마음으로 작성해 보았습니다. 자세한 내용은 하단에 매뉴얼 링크를 달아 두었으니 참조 부탁 드립니다 1. DB 백업/복구 1) 백업 명령어를 알고 싶어요. ① $ cubrid backupdb -D <백업 경로> -z --no-check <DB명> 2) 증분 백업도 지원하나요? ① 큐브리드는 1차, 2차 증분 백업을 지원합니다. ② 증분 백업을 하기 위해서는 백업 옵션 중 -l 옵션을 사용하면 됩니다. 백업수준은 0,1,2 3가지로 나뉘어 지며 각각 전체 백업, 1차 증분 백업, 2차 증분 백업을 의미합니다. ③ 예시 : cubrid backupdb -D <백업 경로> -z --no-check -l 1 <DB명> 3) 복구는 어떻게 해야 하나요? ① $ cubrid restoredb -B <백업 파일 경로> <DB명> 4) 시점 복구도 지원하나요? ① 큐브리드는 어떠한 옵션도 지정되지 않은 경우 기본적으로 마지막 커밋 시점까지 데이터베이스가 복구됩니다. 시점 복구를 하기 위해서는 -d 옵션으로 시간을 지정할 수 있으나, 지정한 복구 시점까지 복구하기 위한 활성로그/보관 로그 ...
    Date2018.12.30 Category제품 여행 By허서진 Views2771 Votes1
    Read More
  5. DBMS? 힐끗 다른 쪽을 바라봤다

    시스템 소프트웨어 개발자로 딱 60살까지만 이런저런 시스템, 특히 대용량 데이터를 다루는 시스템을 직접 설계하고 만들어보고 싶은 마음은 지금도 여전하다. 그리고 그러한 미련에 들어온 DBMS 개발바닥이다. 원래 우직하니 한 우물만 파는 스타일은 아닌데.. 어찌어찌 하다보니 10년째 데이터 처리 엔진쪽으로만 일하고 있는 자신을 바라보며 기특하단 생각도 든다. 하지만 최신 유행하는 다른 분야로 발빠르게 움직이지 못한 것이 못내 아쉬울 때도 종종 있다. 이런 내 마음에는 아랑곳 없이 데이터환경이 휙휙 바뀌면서 하루가 멀다하고 새로운 모양의 시스템, DB들이 마구 쏟아져 나온다. 이런 추세속에서 여전한? 것들을 하고 있는 내 자신을 바라보고 있자면 old school에서 벗어나지 못하고 있는 듯 느껴져 왠지 마음이 급해진다. 이 글을 쓰고 있는 지금도 어디에선가는 새로운 DB(용어따지기 좋아하는 사람들을 위해 여기서 'DB'는 데이터베이스 자체가 아니라 DBMS혹은 DMS를 의미한다는 것을 밝힌다)가 글로벌 DB시장에 런칭하는 소리가 들리는 듯 하니 말이다. 그러나 이쪽 분야에서 일을 하면 할수록 데이터를 다루는 일에 신구라는 것이 없다는 생각이다. 다...
    Date2018.12.28 Category나머지... By조성룡 Views997 Votes0
    Read More
  6. CUBRID 10의 새로운 기능 "문자열 압축"

    CUBRID 10은 새로운 기능이 추가 되었습니다. 그 중에서 문자열 압축기능이 추가되었습니다. 지금부터 문자열 압축 기능에 대해서 알아보도록 하겠습니다. 문자열 압축 기능은 아래의 표와 같습니다. CUBRID 문자열 압축은 255byte 이상에서만 실행되고, 압축이 효율적이지 않으면 압축을 실행하지 않습니다. 문자열 압축률이 얼마나 좋은지 테스트하기 위해서 문자열 압축 기능이 없는 CUBRID 9.3과 10.1에서 테스트 데이타 10만건을 입력하고, 테이블 크기를 확인하는 방법으로 진행하였습니다. “케이스 #1”은 중복 되지 않는 문자열 데이타를 입력하고 압축률을 확인하였고, “케이스 #2”는 중복 된 데이타를 입력하고 압축률을 확인하였습니다. 각 케이스별로 데이타 10만건을 생성한 방법은 아래 표와 같습니다. 먼저 테스트 데이타 1건을 입력하고, “insert 테이블 select ...” 구문에서 카탈로그 테이블과 카테시안 곱(Cartesian Product)을 활용하여 테스트 데이타를 생성하였습니다. 위 표의 SQL문으로 데이타 10만건을 입력하고 테이블 크기를 확인하였습다. 테이블 크기는 “show heap capacity of 테이블명;” 명령을 실행하고 Num_pages 값을 확인하였고, 결과는 아...
    Date2018.12.26 Category제품 여행 By권호일 Views660 Votes0
    Read More
  7. GitHub Desktop을 활용한 소중한 소스 코드 관리

    1) 소중한 자신의 소스 코드가 손상 되거나 손실 되는 경우 2) 외부에서 자신의 소스 코드를 열람해야할 경우 3) 소스 코드의 변경 된 부분을 찾아야 하는 경우 소스 코드를 사용하다 보면 위와 같은 문제로 업무의 연속성이 끊어지는 경우가 발생 합니다. 이러한 문제를 GitHub Desktop을 통해 아주 간단하고 편리하게 사용 및 관리 하는 기능을 소개 하려 합니다. - 비용 : 무료 단, 소스 코드를 비공개하려면 과금 필요 - GUI 프로그램으로 git bash(커맨드 라인) 보다 편리하며, 손 쉽게 사용할 수 있습니다. [1 : GitHub 회원 가입] - 회원 가입 URL : https://github.com/ - IMAGE #1 GitHub 공식 홈페이지 접속 화면 사용할 정보 입력 : Username, Email, Password - IMAGE #2 STEP 1 : 계정 생성 동의 하기 - IMAGE #3 STEP 2 : 계정 유형 선택 - IMAGE #4 사용자 유형 선택 (Skip 해도 무관) - IMAGE #5, 6, 7 STEP 3단계 모두 마치면, Email 확인 후 계정 사용 가능 [2 : GitHub Desktop 설치] - 설치 URL : https://desktop.github.com/ - 지원 OS : Windows, OS X(MAC) - IMAGE #1 공식 홈페이지에서 GitHub Desktop 설치 파일을 받으 실 수 있습니다. (약 80MB) ...
    Date2018.12.03 Category나머지... By윤준수 Views12417 Votes0
    Read More
  8. 오픈소스 DBMS 10년의 여정

    10년 전인 2008년 11월 22일 NHN(현, 네이버)의 첫번째 개발자 행사인 DEVIEW 2008을 통해 CUBRID 오픈소스 버전이 첫 선을 보였습니다. 사용자 확산을 위해 2006년 5월 무료 라이선스를 선언을 한 이후 2008년 초부터 1년 가까이 오픈소스 전환을 위한 준비 과정을 거쳐 결국 오픈소스 DBMS로 변신을 한 것입니다.   -> CUBRID 2008 신제품이 출시되던 날…   오픈소스 DBMS 전환에 대한 사용자들의 인식을 제고하기 위해 버전 표기는 기존 숫자(CUBRID 6, 7) 중심에서 연도 체계 방식으로 변경하여 “CUBRID 2008”로 명칭을 했으며(2013년 3월 출시한 CUBRID 9부터 다시 숫자 표기로 변경), 라이선스의 경우 많은 논의 과정을 통해 엔진은 소스 코드 수정/배포 시 공개 의무가 있는 GPL v2 or higher, 인터페이스와 도구는 자유롭게 수정/배포가 가능한 BSD 라이선스를 채택했습니다.   CUBRID 2008 출시 후 초기 2년 동안의 미션은 개발자 및 사용자 확산이었습니다. CUBRID Inside라는 개발자 중심의 커뮤니티 행사를 통해 내부 개발자와 외부 개발자간에 만남의 장을 마련했고, 닉네임 Pcraft님 같은 경우에는 CUBRID Manager에 컨트리뷰션을 하시다가 추후 CUBRID 개발팀...
    Date2018.11.30 Category오픈소스 이야기 By정병주 Views1243 Votes0
    Read More
  9. 2018년 CUBRID 정기교육을 마무리 하며..

    큐브리드에서는 매년 정기적으로 정기교육을 실시하고 있습니다.   금년도에는 공개SW개발자센터에 공개SW커뮤니티를 등록하여 커뮤니티 활성화 및 큐브리드를 사용자를 위한 교육을 진행했습니다. 정기교육이 어떻게 진행되고 있는지, 커리큘럼, 자주 듣는 궁금증 등에 대해 알아보겠습니다. 『2018년 정기교육 일정』 일시 장소 참석인원 03월 20일 ~ 21일 공개SW역량프라자(상암) 23명 05월 29일 ~ 30일 공개SW개발자센터(선릉) 06명 09월 04일 ~ 05일 공개SW역량프라자(상암) 24명 10월 16일 ~ 17일 공개SW역량프라자(상암) 13명       정기교육은 2일 과정으로 4회 진행되며, 교육에 참여해주신 분들에게 교육 교재와 자료를 나눠드리고, 점심식사도 제공하고 있습니다. 『신청방법』      http://www.cubrid.com/education에서 일정을 확인할 수 있으며, 교육일정 1개월 전에 온라인 신청을 오픈합니다. 『커리큘럼』      다음과 같이 1일차, 2일차로 교육내용이 다르며, 2일동안 교육을 참여해주시는 것이 도움이 됩니다. 또한 실습과정도 포함되어 있습니다.       2일 과정을 수료해주신 분들에게는 큐브리드에서 발급한 수료증을 나눠드립니다. 1일차 CUBRID 소개 ...
    Date2018.11.15 Category알려요~ By정훈 Views503 Votes0
    Read More
  10. timezone, tz data

    Timezone Timezone 하면 딱 생각나는 것은 +09:00, 우리나라는 그리니치 표준시 (GMT)보다 9시간 빠르다는 것이다.  해외 여행중 한국에 국제 전화할 때 꼭 알아야 할 것, "한국 시간 몇시인가?" 잘못하면 식구들 자는 중에 집에 전화할 수 있다. Timezone이 뭔가? 사전적 정의는 “특정 국가나 지역의 현지시간 (local time)” 이다. 그리니치 표준시의 정오는 경도 0도에 위치한 그리니치 천문대 남중 자오선을 태양이 지나가는 시간이다. 1925년 부터, 특정 지역의 local-time은 그리니치 표준시를 기준으로 몇시간 빠르고 느린가로 표현되어왔다. 그리니치 동쪽은 +, 서쪽은 -로 표현한다. GMT 시간이 그리니치 천문대를 지나는 태양을 기준으로 하기 때문에 시간이 지구의 자전 주기와 관련 되며, 자전의 흐름이 늦어지면서 오차가 발생되었고 새로운 표준시 제정에 대한 요구가 나오게 되었다. 1972년, 국제 표준시는 그리니치 표준시에서 UTC (Coordinated Universal Time)로 변경되었다.   UTC는 세슘 원자 시계 기반의 세계 표준시이며,  UTC와 GMT는 소숫점 단위에서만 차이가 나기 때문에 일상적으로 같은 수준으로 혼용해서 사용하기도 하나 기술적인 표현에서는 UT...
    Date2018.11.14 Category제품 여행 By한기수 Views8888 Votes0
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 11 ... 16 Next
/ 16

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales