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. 이노베이션 아카데미와 CUBRID의 산학협력

    이노베이션 아카데미 (42서울) 42SEOUL(42서울)은 아키텍트급 소프트웨어 인재를 양성하는 것을 목적으로 하는 교육 과정이며, 프랑스에서 시작된 에꼴42의 교육 방식 및 인프라를 수입하여 운영하는 형태를 띈다. 에꼴42(Ecole 42)는 프랑스의 대형 통신사 CEO이기도 한 자비에 니엘(Xavier Niel)이라는 억만장자가 프랑스에서 2013년에 설립했다. 설립 당시에도 자기주도 학습 및 동료 평가를 내세운 무료 소프트웨어 교육 기관이라는 점으로 주목받았다. 현재는 브라질, 미국, 일본 등 세계 여러 곳에도 42 캠퍼스가 있다. 2019년에 대한민국 서울에도 42 서울 캠퍼스가 들어왔다. 42의 특징 중 하나로, 자기주도적 학습을 지향하기에 교재나 교수가 따로 없고 모든 것은 스스로 인터넷 또는 각종 도서 등을 통하거나 동료들과의 협업 및 교류를 통해 학습을 하게끔 유도한다. 교육생들 스스로 방법을 찾아 나아가라는 의도이며, 정해진 교재 및 교수가 없기 때문에 필연적으로 많은 삽질과 불분명한 요구사항을 맞닥뜨리게 된다. 심지어 문제를 풀어야 하는데, 뭘 배우고 공부해야 하는지 조차도 제대로 알려주지 않는다. 이는 소프트웨어 현장을 그대로 모방하여 실전 경...
    Date2022.02.22 Category알려요~ By민준 Views291 Votes0
    Read More
  2. Scouter를 통한 CUBRID 모니터링

    Scouter를 통한 CUBRID 모니터링 Scouter 확장을 통해 CUBRID에 항목을 모니터링할 수 있습니다. CUBRID 11.0 버전을 기준으로 개발되었으며, CUBRID 10.2.1 버전부터는 전체 기능을 사용할 수 있습니다. Scouter(Server, Client)는 2.15.0 버전부터 기능 사용이 가능하며, 추후에도 Scouter Github에 참여하여 버그 수정 및 기능이 추가됩니다. 현재(2022-01-10) 2.15.0 버전이 최신 버전이며, Multi Agent 지원 및 버그 수정 내용이 PR 되어 있는 상태입니다. 1. Scouter 란? Scouter는 Open Source APM(Application Performance Management) 이며, 어플리케이션 및 OS 자원등에 대한 모니터링 기능을 제공합니다. Scouter 기본 구성 Scouter 제공 정보 ​- WAS 기본 정보 각 요청의 응답속도 / 프로파일링 정보, 서버 요청 수 / 응답 수, 처리 중인 요청 수, 응답속도의 평균, JVM 메모리 사용량 / GC 시간 , CPU 사용량 - 프로파일링 정보 서버 간 요청의 흐름, 각 SQL 쿼리의 수행 시간 / 통계, API 호출 수행 시간, request header 정보, 메소드 호출 시 수행 시간 대표적인 Agent 목록 - Tomcat Agent (Java Agent) : JVM 과 Tomcat WAS 성능 수집 - Host Agent (OS Agen...
    Date2022.01.10 Category제품 여행 Byhwanyseo Views1773 Votes0
    Read More
  3. [CUBRID] QUERY CACHE에 대해

    QUERY CACHE에 대해 큐브리드 11.0 버전이 출시되면서 QUERY CACHE 힌트를 지원하게 되었습니다. 이 글에서는 QUERY CACHE에 대해 알아보는 시간을 가져보겠습니다. 1. QUERY CACHE란? Query Cache는 SELECT 쿼리문을 이용하여 조회한 값을 저장하고 있다가, 같은 쿼리 문을 요청하였을 때 미리 캐싱된 값을 반환하는 DBMS 기능입니다. 자주 변경되지 않는 테이블이 있고 동일한 쿼리를 많이 받는 환경에서 매우 유용하게 사용될 수 있습니다. QUERY_CACHE 힌트를 사용한 쿼리는 전용 메모리 영역에 캐시되고 그 결과도 별도의 디스크 공간에 캐시됩니다. 쿼리 캐시 특징 1. QUERY_CACHE 힌트는 SELECT 쿼리에만 적용됩니다. 2. 테이블에 변화(INSERT,UPDATE,DELETE)가 일어나게 되면 해당테이블과 관련된 Query Cache내의 정보들은 초기화 됩니다. 3. DB를 내리면 Query Cache는 초기화 됩니다. 4. max_query_cache_entries와 query_cache_size_in_pages 설정 값을 통해 캐시될 크기를 조절할 수 있습니다. (default 값은 모두 0 입니다.) max_query_cache_entries는 최대 캐시할 수 있는 질의 개수에 대한 설정 값으로 1이상으로 설정되면 설정된 수 만큼의 질의가 캐시됩니...
    Date2021.10.29 Category제품 여행 By김민종 Views1592 Votes1
    Read More
  4. [CUBRID inside] HASH SCAN Method

    - HASH SCAN Hash Scan은 hash join을 하기 위한 스캔 방법입니다. view 혹은 계층형 질의에서 Hash Scan이 적용되고 있습니다. view와 같은 부질의가 inner로써 조인될 경우 인덱스 스캔을 사용할 수 없는데, 이 경우 많은 데이터를 반복 조회 하게 되면서 성능 저하가 발생됩니다. 이때 Hash Scan이 사용됩니다. 위 그림은 인덱스가 없는 상황에서의 Nested Loop join과 Hash Scan의 차이를 보여줍니다. NL join의 경우 OUTER의 Row수만큼 INNER의 전체 데이터를 스캔합니다. 이에 반해 Hash Scan은 해시 자료구조 빌드 시 INNER 데이터를 한번 스캔하고, 조회시 OUTER를 한번 스캔합니다. 그렇기 때문에 상대적으로 매우 빠르게 원하는 데이터를 조회할 수 있습니다. 여기서는 Hash Scan의 내부 구조를 프로그램 개발 진행 과정의 흐름으로 작성하였습니다. - IN-MEMORY HASH SCAN CUBRID의 Hash Scan은 데이터양에 따라서 in-memory, hybrid, file hash의 자료 구조를 사용하고 있습니다. 먼저 in-memory 구조부터 살펴보겠습니다. memory의 장점은 random access시 성능 저하가 없다는 점입니다. 하지만 단점은 메모리 크기가 한정되어 있다는 것입니다. 단점 때문에 모든...
    Date2021.10.25 Category제품 여행 By박세훈 Views547 Votes2
    Read More
  5. CUBRID TDE(Transparent Data Encryption)

    CUBRID 11버전에 "TDE(Transparent Data Encryption)"가 추가되었습니다! 2021년 1월 출시된 CUBRID11에 TDE가 생김으로써 보안이 한층 강화되었는데요, TDE란 무엇일까요?! Transparent Data Encryption(이하: TDE) 의 약자로 사용자의 관점에서 투명하게 데이터를 암호화하는 것을 의미합니다. 이를 통해 사용자는 애플리케이션의 변경을 거의 하지 않고 디스크에 저장되는 데이터를 암호화할 수 있습니다. 어떤 해커가 한 조직을 해킹했을 때, 훔쳐가고 싶은 것 1위는 당연히 데이터베이스 내에 있는 중요한 데이터일 것입니다. 또는 회사 내부의 악의적인 의도를 가진 직원이 데이터베이스에 로그인하고 USB와 같은 저장매체에 모든 데이터를 옮겨가는 상황이 있을 수도 있습니다. 이러한 상황들에서 데이터를 보호할 수 있는 가장 쉬운 방법은 데이터베이스를 암호화하는 것인데요, 암호화 기술 중 데이터베이스 파일 자체를 암호화하는 기술인 TDE가 좋은 선택이 되겠죠?! 암호화된 데이터베이스는 키가 없으면 접근할 수 없기 때문에, 이 키 파일을 함께 가지고 있지 않다면 도난당한 파일은 쓸모없는 더미 파일이 될테니까요. TDE 암호화 기능은 대칭키 알고리즘을 사...
    Date2021.05.20 Category제품 여행 By김지원 Views1430 Votes1
    Read More
  6. CUBRID의 개발 문화: CUBRID DBMS는 어떻게 개발되고 있을까?

    시작하며 안녕하세요, 유형규 선임연구원입니다. 이번 포스트에서는 먼저 큐브리드 프로젝트의 개발 프로세스를 소개하고, 프로세스를 개선하기 위한 노력과 개발 문화를 소개하려고 합니다. 큐브리드에 입사한 지 벌써 거의 2년 반이 흘렀습니다. 처음 입사했을 때 하나의 팀이었던 개발 조직도 어느새 대단한 동료 개발자분들이 많이 입사하면서 세 개발팀과 QA팀까지 규모가 제법 커지면서 새로 합류한 신입 동료 개발자분들도 많아졌습니다. 입사 후 첫 메이저 버전 릴리즈를 경험하면서 릴리즈 과정을 돌아보며 동료 개발자들과 큐브리드의 개발 프로세스를 조금 더 개선하게 되었습니다. 오픈소스 데이터베이스 프로젝트, CUBRID의 개발 프로세스 큐브리드는 오픈소스 프로젝트 입니다. 큐브리드는 참여, 개방, 공유의 가치를 지향하며 이를 실현하기 위해 정보의 공유와 프로세스의 투명성은 큐브리드의 개발 프로세스와 문화에 녹아있습니다. 큐브리드에 기여하는 모든 개발자는 오픈소스 프로젝트 개발 프로세스를 기반으로 개발을 진행합니다. 이 의미는 큐브리드 사내의 개발자든 큐브리드에 외부 기여자 (컨트리뷰터) 모두 동일한 과정으로 개발을 진행한다는 것입...
    Date2021.04.29 Category오픈소스 이야기 By유형규 Views1479 Votes1
    Read More
  7. CUBRID를 이용한 스니핑 방지 - 패킷암호화

    보안의 필요성 현대인들은 일상생활에 깊숙이 파고든 PC와 스마트폰으로 웹 서핑을 즐깁니다. 그러다 보니 인터넷상에 전송 중인 데이터를 악의적인 의도로 데이터를 엿볼 수도 있습니다. 즉, 누군가가 전송 중인 데이터를 엿볼 수 있는 것을 스니핑(sniffing)이라고 합니다. 대표적으로 계정의 id, pw를 가로채 타인의 개인 정보를 이용하여 물리적인 손해 입히는 사례가 있습니다. 이에 대해 CUBRID는 사용자 데이터를 보호하기 위해서 패킷 암호화를 제공합니다. 패킷 암호화를 적용하면 전송할 데이터에 대해 패킷이 암호화되어 전송됨으로써 누군가 스니핑(sniffing) 하더라도 데이터를 해석할 수 없게 구현할 수 있습니다. CUBRID 패킷암호화 CUBRID는 클라이언트와 서버 간에 전송되는 데이터를 암호화하기 위해 SSL/TLS 프로토콜을 사용합니다. SSL은 대칭형(symmetric)키를 이용하여 송수신 데이터를 암호화합니다. (클라이언트와 서버가 같은 세션키를 공유하여 암복호함). 클라이언트가 서버에 연결할 때마다 새롭게 생성되는 세션키 생성에 필요한 정보를 암호화한 형태로 교환하기 위해서 비 대칭 (asymmetric) 암호화 알고리즘을 사용하며, 이를 위해서 서버의 ...
    Date2021.04.28 Category제품 여행 By황영진 Views2434 Votes1
    Read More
  8. ANTLR, StringTemplate를 사용해서 PL/SQL을 CUBRID Java SP로 변환하기

    ANTLR, StringTemplate를 사용해서 PL/SQL을 CUBRID Java SP로 변환하기 CUBRID DBMS(이하 'CUBRID')는 PL/SQL을 지원하지 않습니다. PL/SQL 문법으로 함수나 서브 프로그램을 만들어서 해왔던 작업들을 CUBRID에서 하려면 Java Stored Function/Procedure(이하 'Java SP')으로 변환해야 합니다. 데이터베이스 개발자나 관리자, 엔지니어는 PL/SQL 문법에는 친숙하지만 프로그래밍 언어에는 친숙하지 않은 경우가 대부분입니다. 또한 어플리케이션 개발은 사용하는 DBMS에 따라 달라지는 부분이 거의 없지만 PL/SQL을 Java SP로 변환하는 것은 새로운 시스템을 개발하는 느낌을 받아서 어려움을 느끼는 것 같습니다. 그래서 PL/SQL 을 Java SP 쉽게 변환하는 방법에 대해서 찾아보던 중 ANTLR에 대해서 알게 되었습니다. ANTLR는 파서를 만드는 도구입니다. 전세계에 있는 컨트리뷰터들로부터 도움을 받아서 다양한 프로그래밍 언어들의 파싱할 수 있도록 문법 파일들을 지원하고 있습니다. 공식 홈페이지에서는 ANTLR에 대해서 아래와 같이 소개하고 있습니다. "ANTLR (ANother Tool for Language Recognition)은 구조화 된 텍스트 또는 이진 파일을 읽고, 처...
    Date2020.12.31 Category오픈소스 이야기 By주영진 Views2868 Votes2
    Read More
  9. [CUBRID inside] Query Process란?

    CUBRID는 open source DBMS입니다. 소스 코드가 공개되어 있어 언제든지 확인하고 기여할 수 있습니다. 많은 사람이 CUBRID의 contributor가 되길 바라봅니다. Query Process란? Query Process는 DBMS의 입력값인 SQL을 낮은 수준의 명령으로 변환하고 그것을 실행하는 전체 작업을 말합니다. SQL에서 가장 먼저 진행되어야 하는 것은 TEXT로 작성된 SQL을 parse tree 구조로 만드는 것입니다. 이 작업은 PARSER에서 진행되는데, CUBRID는 PT_NODE 구조체를 반복적으로 사용하여 SQL을 parse tree로 변환합니다. 이 단계에서 syntax check가 진행되고 오타나 잘못된 예약어 등을 체크합니다. 그리고 SEMANTIC CHECK를 진행하는데, 여기서 작성된 테이블명이나 칼럼명 등이 존재하는 것인지 체크합니다. 다음으로 OPTIMIZER가 parse tree를 최적화하고 PLAN을 생성합니다. parse tree를 최적화하는 것을 QUERY REWRITE 혹은 TRANSFORMATION이라고 합니다. 좋은 성능을 위해 SQL을 다시 작성한다고 생각하면 됩니다. 동일한 데이터를 조회하는 SQL은 다양한 형태로 작성될 수 있습니다. 그렇기 때문에 가장 효과적인 방안으로 변환을 하는 것입니다. 여러 재작성 방법이 있는데 ...
    Date2020.12.24 Category제품 여행 By박세훈 Views1148 Votes1
    Read More
  10. 파일이 정상인가 ?

    기술 지원 시 파일 변조 또는 손상 되어 골치 아픈 경우가 간혹 발생 합니다. - 고객사 지원을 위해 파일을 반입하는 경우 CD 손상으로 인한 파일 손상 - 보안 프로그램(DRM,EFS)에 의한 파일 변조 - 네트워크를 통한 파일 전송 시 파일 손상 파일 변조 또는 손상이 발생하면, 파일 크기가 크게 변하지 않으며 정합성 여부를 명확하게 확인 할 수 없습니다. 이로 인해 기술 지원 시 뭐가 문제인지 당황스러울 때가 있는데요. 이와 같은 상황에서 불필요한 시간 발생을 최소화 할 수 있는 방법에 대해 기술 하였습니다. 무결성 검사 파일이 변조 되어 있지 않다는 검사를 하기 위해 여러가지 방법들이 있습니다만, 가장 효율적이고 쉬운 방법을 소개하겠습니다. md5 (MD5 128비트 해쉬 암호화 함수)툴은 Windows, Linux, OS X 등 많은 시스템에서 기본적으로 설치 되어 있습니다. 참고 자료 MD5-위키백과 : https://ko.wikipedia.org/wiki/MD5 암호화 해쉬 함수-위키백과 : https://ko.wikipedia.org/wiki/%EC%95%94%ED%98%B8%ED%99%94_%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98 사용 방법 Windows * 실행 > cmd certutil -hashfile <filename> <hash functuin> * ex cmd> certut...
    Date2020.08.29 Category제품 여행 By윤준수 Views2413 Votes1
    Read More
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 16 Next
/ 16

Contact Cubrid

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