반응형

Architecture ColumnStore

 

ColumnStore 테이블을 생성하게 되면, MariaDB 하나의 칼럼당 하나 이상의 파일을 생성하게 된다.

3개의 칼럼으로 구성된 테이블을 생성하게 되면, 최소 3 이상의 파일이 생성된다.

기본적으로 데이터는 압축된다.

 


 

 

익스텐트

Row 카운트가 8 million(8M) rows 들어가 있는 파일.

하나의 익스텐트는 8K짜리 블럭으로 구성된다. 그래서 LOB 처럼 하나의 칼럼 값이 8K 이상이 되면, 익스텐트에는 실제 데이터의 주소값만 저장되고,

실제 데이터는 다른곳에 저장된다.

익스텐트 파일 크기

칼럼이 데이터 타입이

1byte 데이터 유형이면 익스텐트 크기가 8M,

2byte이면 16M,

4byte이면 32M,

8byte이면 64M 짜리 익스텐트 들로 나눠어 져서 저장된다.

세그먼트

하나의 칼럼을 저장하는 익스텐트의 집합.

Col1 칼럼이 1byte 짜리 데이터 유형이였다면, Col1 데이터를 저장하기 위해 8M짜리 익스텐트들이 생성되는데, 하나의 Col1 매칭되는 익스텐트들을 세그먼트라 부름.

하나의 세그먼트당 max extent 파일 개수가 지정되는데, 값은 /usr/local/mariadb/columnstore/etc/Columnstore.xml 파일의 ExtentsPerSegmentFile 값으로 지정된다.

[root@localhost tpch]# cat /usr/local/mariadb/columnstore/etc/Columnstore.xml | grep ExtentsPerSegmentFile

                <ExtentsPerSegmentFile>2</ExtentsPerSegmentFile>

하나의 세그먼트가 ExtentsPerSegmentFile 설정 이상이 되면, 새로운 세그먼트를 생성하고 데이터를 저장한다.

파티션

하나의 테이블에 대하여 칼럼별 세그먼트로 구성되고, 세그먼트는 익스텐트로 구성되어서 파티션 처럼 동작하며, 해당 아키텍처는 폴더와 같은 구조를 가진다.

[root@localhost tpch]# cat /usr/local/mariadb/columnstore/etc/Columnstore.xml | grep DBRoot

                <DBRootCount>1</DBRootCount>

                <DBRoot1>/usr/local/mariadb/columnstore/data1</DBRoot1>

                <ModuleDBRootCount1-1>unassigned</ModuleDBRootCount1-1>

                <ModuleDBRootID1-1-1>unassigned</ModuleDBRootID1-1-1>

                <ModuleDBRootCount1-2>unassigned</ModuleDBRootCount1-2>

                <ModuleDBRootID1-1-2>unassigned</ModuleDBRootID1-1-2>

                <ModuleDBRootCount1-3>1</ModuleDBRootCount1-3>

                <ModuleDBRootID1-1-3>1</ModuleDBRootID1-1-3>

                <DBRootStorageType>internal</DBRootStorageType>

                <FilesPerColumnPartition>4</FilesPerColumnPartition> <!-- should be multiple of DBRootCount -->

 

[root@localhost tpch]# cd /usr/local/mariadb/columnstore/data1

[root@localhost data1]# ls

000.dir  bulkRollback  OAMdbrootCheck  systemFiles  versionbuffer.cdf

[root@localhost data1]# cd 000.dir/

[root@localhost 000.dir]# ls

000.dir

[root@localhost 000.dir]# cd 000.dir/

[root@localhost 000.dir]# ls

003.dir  004.dir  007.dir  008.dir  011.dir

[root@localhost 000.dir]# du -sh *

19M     003.dir

23M     004.dir

4.0M    007.dir

12M     008.dir

878M    011.dir

[root@localhost 000.dir]# cd 011.dir/

[root@localhost 011.dir]# ls

187.dir  191.dir  195.dir  198.dir  202.dir  205.dir  209.dir  212.dir  215.dir  218.dir  221.dir  224.dir

189.dir  192.dir  196.dir  199.dir  203.dir  206.dir  210.dir  213.dir  216.dir  219.dir  222.dir  225.dir

190.dir  193.dir  197.dir  200.dir  204.dir  208.dir  211.dir  214.dir  217.dir  220.dir  223.dir  226.dir

[root@localhost 011.dir]# du -sh *

1.1M    187.dir

1.1M    189.dir

2.1M    190.dir

2.1M    191.dir

2.1M    192.dir

2.1M    193.dir

1.1M    195.dir

2.1M    196.dir

1.1M    197.dir

2.1M    198.dir

2.1M    199.dir

2.1M    200.dir

1.1M    202.dir

1.1M    203.dir

1.1M    204.dir

1.1M    205.dir

1.1M    206.dir

33M     208.dir

33M     209.dir

65M     210.dir

65M     211.dir

33M     212.dir

33M     213.dir

8.1M    214.dir

33M     215.dir

8.1M    216.dir

65M     217.dir

33M     218.dir

33M     219.dir

65M     220.dir

33M     221.dir

65M     222.dir

65M     223.dir

2.1M    224.dir

2.1M    225.dir

193M    226.dir

Extent Map

Extent Map 익스텐트와 그안의 블럭들에 대한 LBID(Logical Block Identifier) 정보와 익스텐트의 min, max value 가지고 있다.

Master copy본은 Primary Performance Module 존재 한다.

시스템이 시작되면 Extent map 메모리에 읽혀서 올려가고, 업데이트가 되면 참여 노드에 브로드캐스트 된다.

 

How Extent Map works

Extent Map "extent elimination" 통해서 쿼리를 만족시키는 블럭만 검색하는 사용된다.

"extent elimination" 조인 필터 조건의 칼럼만 검색한다.

Extent Map 저장되어 있는 최소, 최대값을 이용하여 읽어야 블럭만을 찾아 간다.

 


Version Buffer

MVCC/rollback/스냅샷읽기를 지원하기 위하여 변경된 블럭을 디스크에 저장한다. (SCN 참조)

Version Buffer라고 불리지만, 메모리와 디스크로 구성된다.

메모리는 해시 테이블로 관리되며 초기 4MB 시작하였다가 필요시 증가 한다.

파일 크기는 Columnstore.xml 파일의 VersionBufferFileSize 값으로 설정 하며, 기본값은 1G 이다.

파일은 DBRoot 밑에 여러 파일로 나뉘어져서 저장된다.

 

기타

1. Object Name 소문자로 저장된다.

2. CREATE TABLE AS SELECT문은 지원하지 않는다.

3. PK, FK, 인텍스가 생성되지 않는다.

ERROR 1069 (42000): Too many keys specified; max 0 keys allowed

4. Column level에서 charset절을 사용할 없다.

ERROR 1178 (42000): The storage engine for the table doesn't support The syntax or the data type(s) is not supported by Columnstore. Please check the Columnstore syntax guide for supported syntax

5. Online ADD Column 지원한다. (한번에 하나씩의 칼럼만 추가 가능)

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1

6. 오직 하나의 autoincrement column 생성할 있다,

alter table test_add_column add column id4 int comment 'autoincrement=1'

7. Compress level 0 이면 압축을 하지 않고, 1이면 압축을 한다.

 

반응형

+ Recent posts