Background Image
제품 여행
2020.12.24 17:52

[CUBRID inside] Query Process란?

조회 수 1151 추천 수 1 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

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

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은 다양한 형태로 작성될 수 있습니다. 그렇기 때문에 가장 효과적인 방안으로 변환을 하는 것입니다.  여러 재작성 방법이 있는데 조회조건을 sub-query 안으로 넣어주는 predicate push등이 이에 해당합니다. 다음은 PLAN을 생성하는 것입니다. PLAN에는 어떻게 DATA를 조회할 것인가에 대한 정보가 있습니다. SQL은 어떤 데이터를 조회할 것인지에 대해서만 명시되어 있기 때문에 실제 데이터를 조회하기 위해서 이 단계가 필요합니다(이 단계 때문에 개발자가 어떻게 DATA를 조회할지에 대한 정보를 알지 못해도 됩니다). 여기서 어떻게 조회하는가에 대한 정보는 JOIN 테이블의 SCAN 순서, JOIN METHOD, SCAN METHOD등의 정보를 말합니다. 해당 정보가 PLAN 저장됩니다.

 XASL generator에서 PLAN과 parse tree의 정보를 종합하여 실행계획 정보를 생성하는데 이것은 EXECUTOR에서 바로 실행이 가능한 형태입니다. CUBRID는 이것을 eXtensional Access Specification Language(XASL) 형태로 저장합니다. XASL에는 어떻게, 어떤 데이터를 조회할지 명시되어 있습니다.

 마지막으로 EXECUTOR에서 XASL을 해석하여 heap_next(), index_scan_next()등의 operation을 실행합니다. 이것들은 데이터를 조회하거나 저장하는 낮은 레벨의 명령입니다. 이로써 Query Process가 완료되었고 DBMS 사용자는 원하는 데이터를 얻게 되었습니다. 지금까지 내용을 요약하면 아래 그림과 같습니다.

query process.jpg

 

CUBRID의 query Process를 간략하게 나타낸 것이며, 각 회색 박스 안에 두 번째 줄에 적힌 함수가 각 단계의 시작지점이므로 참고하기 바랍니다. Query Process의 작업을 요약하면 아래와 같습니다.

- PASER 단계를 통해 parse tree 구조체(PT_NODE)가 생성 
- SEMANTIC CHECK를 통해 정보가 추가된 parse tree가 생성
- REWRITER 단계를 통해 최적화된 parse tree로 변형 
- OPTIMIZER에서 어떻게 조회할지에 대한 PLAN을 생성 
- XASL GENERATOR에서 실행 가능한 XASL를 생성
- EXECUTOR에서 XASL을 실행하여 원하는 데이터 조회

 

PARSER


parser는 text인 SQL을 parsing 하여 parse tree를 생성합니다. 오픈소스 'BISON'을 사용하며, PT_NODE 구조체를 반복 사용하여 tree를 구성합니다. 아래는 간단한 SQL에 대해 parser가 parse tree를 생성한 예시입니다.
parser.jpg

 

위 그림에서 하나의 BOX는 PT_NODE 구조체를 나타냅니다. 파란색 부분은 PT_NODE.node_type 이고, 하늘색 부분은 PT_NODE.info 공용체를 나타낸 것입니다. PT_NODE 구조체는 node_type에 따라 공용체인 info의 선택되는 변수가 달라집니다. 예를 들면 'PT_SELECT'는 info.query를 사용하고, 'PT_EXPR'은 info.expr을 사용합니다. 다양한 parse tree의 구조를 확인하기 위해서는 parser_main() 함수 실행 이후 결과에 대해서 PT_NODE 구조체를 확인해 봐야 하는데, text 기반인 gdb보다는 DDD(display data debuger)를 사용하는 것을 추천합니다.

parsing은 BISON을 통해 진행됩니다. BISON의 동작 원리에 대한 이해는 아래 링크를 통해 확인하기 바랍니다. 
https://www.gnu.org/software/bison/manual/html_node/index.html

parse tree를 생성하는 과정에 자연스럽게 syntax check가 진행되며, 간단한 rewrite도 진행됩니다. 위 예시는 조회조건의 변경이 있었습니다. 새로운 sql 구문의 추가나 변경 시에 parser의 수정이 있어야 하는데 csql_lexer.l, csql_grammar.y 파일의 수정이 필요합니다. csql_grammar.y에서 grammar의 action 부분에는 PT_NODE를 생성하는 로직이 포함되어 있으니 관련 있는 키워드를 통해 로직을 확인하는 것이 중요합니다.  

 생성된 parse tree를 체크하기 위해 tree를 탐색해야 하는데 parse_walk_tree() 함수가 이를 수행합니다. pre-order와 post-order 함수를 인자에 추가 할 수 있어 tree를 탐색하며 적절한 동작을 할 수 있습니다. 또한 node_type에 따라 어느 info의 공용체가 사용되는가에 대해서는 parse_walk_tree()에서 적용되는 apply 함수를 확인하면 되는데,  pt_init_apply_f() 함수에서 어떠한 apply 함수가 적용되는지 확인할 수 있습니다. 예를 들면 'PT_SELECT'의 경우 pt_init_apply_f() 함수에서 확인하면 pt_apply_select()를 사용하는 것을 알 수 있는데 해당 함수에서 info의 어느 변수를 사용하는지 확인이 가능합니다.

 

PRE FETCH


타 DBMS와 차이를 보이는 것은 'PRE FETCH' 단계가 있는 것입니다. 이 단계를 SEMANTIC CHECK의 한 부분으로 생각해도 되겠습니다.
CUBRID는 CAS와 CUBRID server가 분리된 3-tier 구조이기 때문에 TABLE의 스키마 정보 등 meta-data에 대한 client(CAS)와 server(CUB_SERVER)의 동기화가 필요합니다. SQL에 포함된 테이블 정보에 대해서 CAS가 cub_server에 요청하여 데이터를 받고 CAS의 work space공간에서 해당 데이터를 cache하여 사용합니다.

 

pre fetch.jpg

위 그림은 cub_server와 CAS 간에 meta-data를 주고받는 흐름을 나타낸 것입니다.

1. QUERY가 입력되면 pre_fetch에서 CAS의 work space에 해당 table이 cache되어 있는지 확인
   1.1 cache되어 있음 : CHN(cache coherency number)번호를 server에 전송하여 최신 object임을 확인. 아닐경우 server로 부터 object 수신
   1.2 cache되어 있지 않음 : server로 부터 object 수신
2. CAS의 work space에 Classname_cache라는 전역변수에 해당 object를 cache함
   2.1 Ws_commit_mops에는 해당 transcation에 관련 있는 object를 linked list로 관리함.
3. commit 시 : Ws_commit_mops의 object 삭제
   3.1 rollback 시 : Classname_cache에서 해당 transation의 관련 있는 object를 decache함.

PRE FETCH는 CUBRID가 3-tier로 구성되어 있기 때문에 필요한 단계입니다. 분산 처리 측면에서 의미가 있는 단계입니다.

SEMANTIC CHECK


SEMANTIC CHECK 단계에서는 크게 3가지 작업을 진행합니다.
 첫 번째는 테이블명등의 정보를 체크하고 관련 정보를 추가하는 것입니다. 이렇게 테이블명 혹은 칼럼명과 같이 schema정보에서 참조하는 정보는 pt_node의 node_type이 PT_NAME으로 생성됩니다. 즉 node_type이 PT_NAME인 node에 대해서 체크하고 정보를 추가하는 작업이 필요합니다. pt_resolve_names() 함수에 관련 작업을 진행합니다.
 두 번째는 type을 체크하는 작업입니다. 스키마의 등록된 type과 이에 대칭되는 상수 혹은 다른 칼럼의 type이 호환 가능한지 확인하고 필요에 따라 CAST 함수를 추가해줍니다. type check에는 문자열의 charset과 collation도 포함됩니다. pt_semantic_type() 함수에서 관련 작업을 진행합니다.
 세 번째는 constant fold입니다. 상수만으로 구성된 함수나 연산 등을 EXECUTOR 단계에 가기 전에 미리 처리합니다. 예를 들면 'select 1+2 from dual'에서 1+2의 연산을 미리 계산하여 3으로 변환합니다.  CUBRID에서는 CAS에서 따로 수행되기 때문에 DB SERVER의 부하를 줄여주는 역할을 합니다. pt_fold_constants_post() 함수에 관련된 주요 소스 코드가 있습니다.
그 외에도 많은 체크나 변환이 포함되어 있습니다만 주요 내용을 요약하면 SEMANTIC CHECK는 스키마와 같은 meta data를 parse tree에 추가하고 그 과정에서 문제시 semantic error를 발생하는 단계입니다.

 

 

REWRITER (QUERY TRANSFORMATION)


REWRITER 단계에서는 SQL을 재작성합니다. parse tree에서 특정 패턴을 인식하고 그 구조를 변경하는 작업입니다. 주로 SQL의 성능 향상을 위한 작업입니다만, 이후 단계의 작업을 위해 변환하는 항목도 있습니다. 많은 변환 패턴이 있지만 몇 가지만 소개하겠습니다.

- predicate의 형식을 CNF(Conjunctive Normal Form)로 변환
- view를 view spec으로 derived table 변환
- predicate의 상수 변수를 host 변수로 치환
- uncorrelated subquery를 join으로 변환
- sub-query 밖의 관련 조회조건을 안으로 이동 
- 그 외 다수의 변환이 있음 

여기서 CNF변환과 view의 변환은 이후 작업 진행을 위해 진행되는 재작성입니다. 조회 조건을 CNF로 변환하는 것은 인덱스 스캔의 대상을 효과적으로 찾기 위함입니다. CNF는 논리곱 표준형으로 'AND'로 묶인 조회조건입니다. 아래 예시를 보면 CNF와 DNF의 차이를 확인할 수 있습니다.

(col1=1 or col2=1) AND (col3=1 or co4=1)       ==> CNF
(col1=1 and col2=1) OR (col3=1 and col4=1)   ==> DNF

CUBRID는 모든 조회 조건을 CNF로 변환하려는 시도를 하며, CNF로 변환되거나 작성된 조회조건만 인덱스 스캔의 대상이 됩니다. 이론상 모든 DNF는 CNF 변환이 가능하지만 조회조건의 개수가 늘어날 수 있는데 CUBRID는 한 개의 조회조건의 변환된 결과가 100개를 초과하면 해당 조회조건을 변환하지 않습니다.
rewriter.jpg  
위 그림에서 빨간색 박스 부분을 보면 predicate가 CNF 변환이 적용된 것을 볼 수 있습니다. 위 그림의 predicate는 'col1=1 and col2=1' 으로 그 자체로 CNF이므로 predicate의 자체는 변경되지 않았지만, 'AND','OR'와 같은 logical operation의 변경이 있었습니다. parser에서는 logical operation을 하나의 PT_NODE로 표현했지만, 변환된 이후에는 next(AND)와 or_next(OR) 포인터를 사용하는 구조로 변경되었습니다. 이러한 구조로 변경되었기 때문에 이후 predicate 검색은 아래와 같이 수행됩니다. 'PT_AND'와 'PT_OR' operation을 가지는 predicate는 cnf 변환이 안 된 것입니다.

while PT_NODE.next
   predicate 처리
   while PT_NODE.or_next
     predicate 처리

이 이외에도 다양한 재작성이 진행됩니다. qo_optimize_queries() 함수에 대부분의 재작성 소스 코드가 작성되어있습니다. 해당 함수의 진행 이전과 이후의 tree를 비교하여 어떠한 재작성이 진행되었는지 확인 할 수 있습니다. 또한 plan 정보에서 재작성된 SQL을 text 형태로 확인 할 수 있습니다.

 

OPTIMIZER


OPTIMIZER는 어떻게 DATA를 검색하는 것이 최적인지 예측하고 그 정보를 PLAN에 저장합니다. 관련 정보는 크게 3가지입니다. 첫째는 한 테이블에 대한 access method입니다. index scan, heap scan 등이 이에 해당합니다.  두 번째는 테이블의 join 순서입니다. 그리고 세 번째는 join method입니다. Nested loop join이나 sort merge join이 이에 해당합니다. 이러한 정보를 얻기 위해서 모든 가능한 plan의 cost를 측정하고 가장 낮은 cost를 갖는 PLAN을 결정합니다. 이를 위해 parse tree를 query graph 형태로 저장하게 되는데 아래에 매칭되는 주요 용어를 간단하게 정리하였습니다.

 

- NODE : table
- TERM : predicate(조회조건)
- SEGMENT : column
- EQCLASS : join predicate's columns

cost의 계산은 칼럼의 1 / Number of Distinct Value(NDV) 을 선택도(selectivity)로 사용합니다. 모든 데이터가 고르게 분포되어 있다고 가정하고 데이터 조회 이전에 몇 개의 행이 조회될지 예측하는 것입니다. 상대적으로 적은 행을 가지는 테이블을 먼저 조회하는 것이 유리할 가능성이 높습니다. 먼저 term(predicate)에 대해서 cost를 계산 및 인덱스 스캔이 가능 여부 등을 체크합니다. 관련 함수는  qo_analyze_term()입니다. term에 대한 분석이 완료되면 node(table)들을 순회하며 생성될 수 있는 모든 경우의 plan의 cost를 비교하고 그중 가장 최적의 plan을 결정합니다. planner_permutate()에서 그 작업을 진행합니다.

optimizer.jpg
위 그림은 join 순서가 A->B이고, index join method가 선택되었을 때 plan 객체를 나타낸 것입니다. 한 박스는 QO_PLAN 객체이고 파란색 부분이  plan_type, 그 밑의 부분이 공용체인 plan_un 정보입니다. parser의 PT_NODE와 비슷하게 plan_type에 따라 공용체 plan_un의 정보가 달라지는 구조입니다.
PLANTYPE_SCAN에는 각 테이블의 scan_method와 인덱스 관련 term이 저장됩니다. term(조회조건)은 인덱스 스캔 가능 여부에 따라 key range, key filter, data filter로 나눌 수 있습니다. 이것이 각각 term, kf term, sarg term에 저장됩니다. PLANTYPE_JOIN에는 outer와 inner 테이블 정보 및 join method 정보가 포함되어 있습니다. 그리고 마지막으로 PLANTYPE_SORT에 order by 절 관련된 내용이 생성됩니다.

 

XASL GENERATOR


XASL은 eXtensional Access Specification Language의 약자입니다. CUBRID는 EXECUTOR에서 이 XASL을 해석하여 원하는 데이터를 얻습니다. 접근 사양이라는 것은 어떻게 그리고 어떤 데이터를 접근할 것인가에 대한 정보이고, 이것은  OPTIMIZER에서 생성된 PLAN과 parse tree에 저장되어 있습니다. 이 두 가지 정보를 종합하여 XASL 형태로 저장합니다. XASL generator를 OPTIMIZER 단계의 부분으로 생각해도 무리는 없을 것 같습니다. 

 

xasl generator.jpg
위 그림은 JOIN  순서가 A->B->C일 때 생성된 PLAN을 가지고 XASL_NODE가 생성되는 모습을 나타낸 것입니다. 한 개의 XASL_NODE는 한 개의 access spec을 가지고 이는 한 개의 테이블 조회에 대한 정보를 담는다고 생각하는 것이 이해가 쉬울 것 같습니다. 물론 partition table 같은 경우 한 개의 XASL_NODE 여러 개의 access spec을 가질 수 있습니다. 일반적으로 SQL에서 table이 존재할 수 있는 위치는 FROM절 입니다. 이것은 join 형태로 작성될 수도 있고, sub query로 작성될 수 있습니다. 위 그림에서는 join으로 연결되어 있으며 이것이 scan_ptr로 연결된 것을 확인 할 수 있습니다. 이러한 XASL_NODE를 연결하는 주요 포인터는 아래와 같습니다.

- APTR : uncorrelated sub query
- DPTR : correlated sub query 
- SCAN_PTR : join

correlated sub query는 외부에 참조하는 칼럼이 있는 것이며, uncorrelated sub query는 외부 참조 칼럼이 없는 것을 뜻합니다.

SELECT 1 
   FROM TBL1 A
              ,(SELECT * FROM TBL2  WHERE COL1 = A.COL1) B
              ,(SELECT * FROM TBL3 WHERE COL1 = 3) C

위에서 B는 correlated sub query이고, C는 uncorrelated sub query입니다. sub query를 구분한 이유는 correlated sub query의 경우 참조되는 데이터가 먼저 조회돼야 하므로 scan의 순서가 정해집니다. 반면에 correlated sub query는 그런 순서의 제약이 없어 가장 먼저 scan을 진행 할 수 있습니다. 위 그림은 join만 존재 하기 때문에 scan_ptr만 사용되었는데, sub query가 사용되면 그 성격에 따라 aptr과 dptr로 XASL node가 연결됩니다. 대부분의 SQL이 3가지 pointer로 XASL_NODE를 연결하는 것으로 표현이 가능합니다.

 

EXECUTOR


XASL을 해석하여 data를 조회하거나, 저장, 변경하는 단계입니다. Volcano model (Iterator Model)로 구현되어 있는데, 이는 데이터를 조회하는 데 있어 연관된 join, sub query, predicate의 평가를 진행하여 하나의 행을 확정하고 다음 행의 조회를 이어서 수행하는 구조입니다. qexec_execute_mainblock()함수가 이 단계의 시작 지점입니다.

 

executor.jpg
위 그림은 SQL에서 XASL이 생성되고 이를 실행하는 순서를 나타낸 것입니다. 아래와 같은 순서로 scan이 진행됩니다.

1) join의 순서가 첫 번째인 tab a의 XASL node가 시작 node가 된다.

2) tab a node의 aptr인 빨간색 박스의 node가 먼저 scan 되어 결과를 temp file에 저장한다.

3) tab a node에 대한 scan이 진행되고 1row 조회한다.

4) join 관계인 tab b node에 대해서 위 단계에서 1row 조회된 데이터를 사용하여 scan을 진행한다.

5) 이전 조회 결과set을 사용하여 dptr인 tab c node를 scan한다.

6) 지금까지 조회된 1row의 대한 결과를 temp file에 저장한다.

7) (3)단계로 이동하여 새로운 1row를 조회하고 전체 row가 조회될 때까지 반복한다.

aptr과 dptr과 같은 sub-query pointer는 독립적인 XASL_NODE입니다. 그래서 시작지점과 동일한 qexec_execute_mainblock() 함수를 호출합니다. 이에 반해 join은 main block과 연결되어 여러 테이블의 스캔을 같이 수행하여 하나의 행을 생성합니다. 호출되는 함수는  qexec_execute_scan()입니다. 하나의 행이 결정되어 저장되는 것은 qexec_end_one_iteration() 함수에서 진행됩니다.

 

지금까지 CUBRID의 Query Process에 대해서 개괄적으로 설명하였습니다. 다음에는 조금 더 자세히 각 단계의 상세 내용에 관해서 이야기해보겠습니다.


  1. CM을 통해 SQL을 분석해보자.

    SQL을 수행하다 보면 SLOW SQL이 많이 발생합니다. 이럴때, 해당 SQL의 실행계획을 확인 함으로써, 지연을 발생시키는 부분을 쉽게 찾을 수 있습니다. 1. SQL 서식화. - 보통 SQL을 LOG에서 copy 할경우 가시적으로 보기 힘든경우 사용합니다. 2. 질의 실행 계획보기. - 질의편집기에 SQL을 작성 후, 질의 실행계획보기를 통하여 해당 SQL의 실행계획을 확인 할 수 있습니다. 2.1 질의실행계획보기 --계속 - 질의 실행 계획보기를 실행 시, 질의 계획의 원본, 트리출력, 그래픽출력 등으로 쉽게 확인이 가능합니다. - 이글에서 주로 다룰 내용은 트리출력이며, 보다 사용자가 보기 편리한 구조로 이루어져 있습니다. - 해당 내용을 분석하면, olympic 테이블과 record 테이블은 서로 inner join으로 조인이 이루어 집니다. - olympic 테이블은 FULL SCAN이 일어났으며, 모두 디스크 io가 발생하였습니다. - record 테이블은 primary key(host_year)을 사용하여 인덱스 범위검색을 하였습니다. - 이때, olympic 테이블에서 추출한 레코드는 총 25개 이며, record 테이블에서는 2000개의 레코드를 추출하였습니다. - olympic 테이블에서의 전체 row는 25건이며, 페이지로는 1게 ...
    Date2019.01.01 Category제품 여행 By박동윤 Views1290 Votes0
    Read More
  2. ‘시작하세요! 큐브리드’ 전자책 다운로드 1천건 돌파!!!

    '시작하세요! 큐브리드' 전자책 다운로드 수가 1,000건을 넘었습니다(10월 20일 기준 1,007건). 금년 2월 8일부터 무료 다운로드가 시작되었으니 약 8개월 10일 정도 걸렸으며, 일 평균 다운로드 수는 4건입니다. 원래 ‘시작하세요! 큐브리드’ 도서는 2015년 5월 출간된 이후 하드 카피와 전자책(PDF) 형태로 유료 판매를 했었으며, 금년 2월에 출판사인 위키북스의 도움으로 전자책을 무료로 전환했습니다. CUBRID 사용자 확산을 위한 조치였는데, 기대 이상으로 많은 분들이 다운로드를 받아가셨습니다.  [도서 다운로드: http://www.cubrid.com/notice/3808747]  참고로, 2008년 2월에는 ‘큐브리드 7.3을 이용한 데이터베이스 이해와 실습’이라는 도서를 출간한 적이 있습니다. 당시 도서 출간 목적은 대학에서 데이터베이스 이론을 가르치면서 DBMS 실습 과정에 CUBRID를 활용하도록 하기 위함 이었습니다. 따라서, 데이터베이스의 이론적인 배경이 부족한 학생들에게 데이터베이스에 대한 기초적인 지식을 습득할 수 있도록 콘텐츠가 구성되어 있습니다. 얼마전 10월 황금연휴 기간에 교보문고 강남점에 간 적이 있었는데, 아직도 책장에 꽂혀 있어서 깜짝 놀랐습니다. 출...
    Date2017.10.20 Category알려요~ By정병주 Views1283 Votes0
    Read More
  3. 오픈소스 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
  4. 클라우드와 리눅스, 그리고 마이크로소프트

    2014년 10월 미국 샌프란시스코에서 개최된 마이크로소프트 기자간담회에서 2월에 취임한 신임 CEO인 사티아 나델라(Satya Nadella)는 “Microsoft loves Linux”라는 메시지를 전달함으로써 시장에 충격을 주었습니다. 왜냐하면 전임 CEO인 스티브 발머(Steve Ballmer)는 리눅스를 “암(cancer)”적인 존재라는 표현으로 적대시 해왔고, 마이크로소프트 회사 자체가 독점(proprietary) 소프트웨어를 통해 엄청난 수익을 창출한 대표적인 기업이기 때문입니다.  마이크로소프트는 CEO가 바뀌었을 뿐인데 어떻게 리눅스를 바라보는 회사의 입장이 180도 바뀌었을까요? 사티아 나델라 CEO의 설명을 들어보면 이미 마이크로소프트 애저(Azure) 플랫폼의 VM (Virtual Machine) 중에 약 20% 정도가 오픈소스 운영체제라는 것입니다. 따라서, 마이크로소프트 애저 플랫폼을 확산시키기 위해서는 리눅스 사용자들을 수용할 수 밖에 없었던 것이며, 실질적으로 ‘마이크로 소프트의 밥줄은 윈도우가 아니다.’라는 기사를 확인해 보면, 2015년 4사분기 기준으로 매출 실적 1위는 클라우드 서버, 2위는 게임 부문, 3위 오피스, 4위 윈도우 순으로 나타납니다. (윈도우의 전체 매출 비중은 10%)...
    Date2017.09.06 Category시장 살펴보기 By정병주 Views1237 Votes0
    Read More
  5. No Image

    DB2, Informix, Sybase ASE, Postgres DBMS 데이터를 CUBRID로 이관하는 방안에 대하여...

    DBMS 보급과 관련하여 과거와는 달리 민간 및 공공기업에서 서비스 중요도 및 비용등을 고려하여 다양한 제품을 도입하여 사용하고 있다. 뿐만 아니라 시스템 사용연한 도래, 유지보수 비용절감, 클라우드 전환 및 차세대 시스템 도입을 통해서 기존 DBMS를 다른 DBMS로 변환하는 경우가 빈번하게 발생하고 있다. DBMS 변경으로 응용체계 전환 및 데이터 전환, 운영 및 사용자 기술전환등이 수행되는데 기술적 측면 및 비용적인 부분에서 예상보다 많은 리스크를 직면하게 되기도 한다. 성공과 실패는 면밀한 전환환경에 대한 분석 및 계획과 수행하는 기술자들의 자질에(기술 및 도전적 & 긍정적 마인드) 의해 결정된다. 이러한 여러 요소들 중에서 여기서 다루고자 하는 부분은 전환에 있어 기본이면서 중요한 데이터 전환에 대한 부분이다. 큐브리드는 국산을 제외한 외산 DBMS중에 민간 및 공공기간을 통틀어 점유율이 높다고 볼 수 있는 Oracle 및 MS-SQL, MySQL에 대해서 데이터 이관 툴을 제공하고 있다. 해당 제품명은 CMT(Cubrid Migration Toolkit)이며 Linux 및 Windows 버전을 기본으로 GUI 및 Terminal 방식을 지원하고 있다. 그 이외에도 비록 시장 점유율은...
    Date2019.07.15 Category제품 여행 By김창휘 Views1209 Votes0
    Read More
  6. [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박세훈 Views1151 Votes1
    Read More
  7. JPA와 CUBRID 연동 가이드

    JPA? JPA는 자바의 ORM 기술 표준으로 인터페이스의 모음입니다. 표준 명세를 구현한 구현체들(Hibernate, EclipseLink, DataNucleus)이 있고, JPA 표준에 맞춰 만들면 사용자는 언제든 원하는 구현체를 변경하며 ORM 기술을 사용할 수 있습니다. 이번 CUBRID 연동 가이드에서는 대표적으로 많이 사용하는 Hibernate를 사용하여 작성했습니다. 버전 정보 SpringBoot: 2.7.8 Hibernate: 5.6.14.Final Java: 11 CUBRID: 11.0.10, 11.2.2 JPA와 CUBRID 연동 1) 라이브러리 설정 Maven 프로젝트에 JPA(Hibernate), CUBRID JDBC 라이브러리를 넣기 위해 pom.xml에 설정을 합니다. CUBRID JDBC를 받기 위해 repository도 같이 추가해야 합니다. 2) JPA 설정 필요한 라이브러리를 다 받은 뒤 JPA 설정 파일인 persistence.xml에 설정을 해줘야 합니다. 해당 파일은 표준 위치가 정해져 있기 때문에 /resources/META-INF/ 밑에 위치해야 합니다. DBMS 연결 시 필요한 정보와 JPA 옵션들을 설정해 줍니다. 기본적으로 driver, url, user, password를 설정하고, 방언(dialect)도 필수적으로 설정해야 합니다. DBMS가 제공하는 SQL 문법과 함수들이 조금씩 다르기 때문에 JPA가 어떤 DBMS...
    Date2023.02.22 Category나머지... By김동민 Views1136 Votes3
    Read More
  8. CUBRID contribute의 두번째 걸음, CUBRID 디버깅 하기

    디버깅은 실행중인 프로세스를 컨트롤할 수 있어 문제점을 찾거나 현재 로직을 확인 할 때 유용한 방법입니다. 이번에는 GDB를 활용하여 CUBRID server 프로세스를 디버깅해보도록 하겠습니다. GDB 사용에 앞서 CUBRID 빌드가 되어 있어야 합니다. CUBRID  빌드 관련 내용은 아래 링크를 확인하세요. http://www.cubrid.com/blog/3814572   디버깅을 위해서는 'debug' 모드로 빌드해주세요.  1 2 [root]vi build.sh build_mode="debug" cs   빌드시 에러가 발생한다면 표준에러만 파일로 리다이렉션하여 확인하는 것이 좋습니다.  1 2 [root]vi build.sh 2> error.out vi error.out cs 빌드가 완료가 되었다면 bash_profile 파일에 PATH 관련 정보를 추가 저장합니다. CUBRID 위치는 build시 저장한 위치로 변경하세요.  1 2 3 4 5 6 7 8 9 10 cd ~ [root]vi .bash_profile export CUBRID=/cubrid10.1/CUBRID   export CUBRID_DATABASES=$CUBRID/databases export PATH=$PATH:$CUBRID/bin export LD_LIBRARY_PATH=$CUBRID/lib:$LD_LIBRARAY_PATH CLASSPATH=$CUBRID/jdbc/cubrid_jdbc.jar export CLASSPATH [root]source .bash_profile cs demo DB를 생성합니다.​ 1 2 3 4 5 6 c...
    Date2018.08.09 Category제품 여행 By박세훈 Views1090 Votes0
    Read More
  9. CUBRID Network Diagram (CUBRID Version 9.3, 10.1)

    CUBRID Network Diagram 큐브리드를 사용하다 보면 네트워크 연결 구성에 대해 궁금할 수 있습니다. 이런 궁금증에 대해 간단한 이미지와 설명으로 큐브리드 네트워크 연결 구성에 쉽게 다가 올 수 있도록 기술 하였습니다. 들어가기에 앞서 큐브리드 네트워크 연결 구성에 대해 이해하기에 OS 환경 및 CUBRID 버전에 따른 약간의 차이점이 있습니다. 아래의 2가지 기능 차이에 대해서 숙지 하시면 큐브리드 네트워크 다이어그램에 대해 쉽게 이해하실 수 있습니다. - Windows 큐브리드 버전에서는 SHARD Broker 기능과 HA 환경을 제공 하지 않습니다. (SINGLE 구성만 제공) - Linux 큐브리드 버전 9.3에서는 SHARD Broker기능을 제공 하지만 10.1버전에서는 SHARD Broker 기능을 제공 하지 않습니다. 큐브리드 네트워크 다이어그램 세부 정보 < Master / Slave / Replica Node > HA 환경의 데이터 베이스를 구성하는 서버 - cub_master : 실제 데이터 베이스 프로세스와 연결을 담당하는 프로세스 - cub_manger : CUBRID Manger 프로그램의 관리모드 사용을 위한 프로세스 < SINGLE > HA환경이 아닌 싱글로 운영 되는 데이터 베이스 서버 - cub_master : 실제 데이터 베이스 ...
    Date2019.11.02 Category제품 여행 By윤준수 Views1084 Votes1
    Read More
  10. DBMS? 힐끗 다른 쪽을 바라봤다

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

Contact Cubrid

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