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이면 압축을 한다.