CREATE TABLESPACE


create_tablespace_stmt:

datadisk_list:

data_disk:

data_disk_property:


create_tablespace_stmt ::= 'CREATE TABLESPACE' tablespace_name 'DATADISK' datadisk_list
datadisk_list ::= data_disk ( ',' data_disk )*
data_disk ::= disk_name data_disk_property
data_disk_property ::= '(' 'DISK_PATH' '=' '"' path '"' ( ',' 'PARALLEL_IO' '=' number )? ')'


-- 예제
create tablespace tbs1 datadisk disk1 (disk_path=""); -- $MACHBASE_HOME/dbs/ 에 생성
create tablespace tbs1 datadisk disk1 (disk_path="tbs1_disk1"); -- $MACHBASE_HOME/dbs/tbs1_disk1 에 생성되며 이때 tbs1_disk1폴더가 존재해야 한다.
create tablespace tbs2 datadisk disk1 (disk_path="tbs2_disk1", parallel_io = 5); 
create tablespace tbs1 datadisk disk1 (disk_path="tbs1_disk1", parallel_io = 10), disk2 (disk_path="tbs1_disk2"), disk3 (disk_path="tbs1_disk3");

목차


CREATE TABLESPACE 구문은 로그 Table 또는 로그 Table의 Index가 저장될 Tablespace를 $MACHBASE_HOME/dbs/ 에 생성한다.

Tablespace는 여러 개의 Disk를 가질 수 있다. Table과 Index의 데이터를 저장하는 각각의 Partition File들이 저장될 때, Tablespace에 속한 Data Disk들에 분산되어 저장된다.

만약 2개 이상의 Disk를 사용 시 Index와 Table의 여러 File이 각 Disk에 분산 저장되고, 각각의 Device에서 Parallel 하게 IO가 수행되어 Disk 개수가 늘어날수록 Disk I/O Throughput 이 높아져 다량의 Data를 빠르게 Disk에 저장할 수 있는 이점이 있다.

또한, Table과 Index의 Tablespace를 별도로 생성하고 각각 다른 Disk를 정의할 경우, Physical Disk의 재구성 없이, Logical 하게 Table과 Index의 I/O를 분리할 수 있다.

DATA DISK

Tablespace에 속한 Disk를 정의한다. 각 Disk는 다음과 같은 속성을 가진다.

속성설명
disk_nameDisk 객체의 이름을 지정한다. 추후에 Alter Tablespace구문을 통해서 Disk객체의 속성을 변경할 때 사용한다.
data_disk_propertyDisk의 속성을 지정한다.
disk_pathDisk의 Directory Path를 지정한다. 이 Directory는 Create 되어 있어야 한다. 상대 Path로 Path를 지정시 $MACHBASE_HOME/dbs 기준으로 PATH를 찾는다. 예를 들어 PATH='disk1'일 경우 Disk Path를 $MACHBASE_HOME/dbs/disk1으로 인식한다.
parallel_ioDisk의 IO Request를 Parallel하게 몇 개까지 허용할 지를 결정한다. (DEF: 3, MIN: 1, MAX: 128)

CREATE TABLE


create_table_stmt:

column_list:

column_property_list:

table_property_list:

column_type:


create_table_stmt ::= 'CREATE' ( 'LOG' | 'VOLATILE' | 'LOOKUP' )? 'TABLE' table_name '(' column_list ')' autodel? table_property_list?
column_list ::= column_name column_type column_property_list? 'PRIMARY KEY'? 'NOT NULL'? ( ',' column_name column_type column_property_list? 'PRIMARY KEY'? 'NOT NULL'? )*
column_property_list ::= 'PROPERTY' '(' ( 'PART_PAGE_COUNT' | 'PAGE_VALUE_COUNT' | 'MINMAX_CACHE_SIZE' | 'MAX_CACHE_PART_COUNT' ) '=' value ( ',' ( 'PART_PAGE_COUNT' | 'PAGE_VALUE_COUNT' | 'MINMAX_CACHE_SIZE' | 'MAX_CACHE_PART_COUNT' ) '=' value )* ')'
table_property_list ::=  ( 'CHECK_FORGERY' | 'TAG_PARTITION_COUNT' ) '=' value
column_type ::= 'SHORT' | 'USHORT' | 'INTEGER' | 'UINTEGER' | 'LONG' | 'ULONG' | 'FLOAT' | 'DOUBLE' | 'DATETIME' | 'VARCHAR' '(' size ')' | 'IPV4' | 'IPV6' | 'TEXT' | 'BINARY' 
-- 5개의 column을 가진 ctest table을 만든다.
Mach> CREATE TABLE ctest (id INTEGER, name VARCHAR(20), sipv4 IPV4, dipv6 IPV6, comment TEXT);
Created successfully.

테이블 종류

테이블 종류설명
LOG_TABLECREATE TABLE 사이에 아무런 키워드를 넣지 않았다면 Log Table이 생성된다.
VOLATILE_TABLE

VOLATILE_TABLE은 모든 데이터가 임시 메모리에 상주하는 임시 테이블이며 로그 테이블을 조인하여 결과를 향상시킵니다만,

Marbase 서버가 종료 되자마자 사라집니다.

LOOKUP_TABLEVOLATILE_TABLE과 마찬가지로 LOOKUP_TABLE은 메모리의 모든 데이터를 저장함으로써 빠른 쿼리 처리를 수행 할 수 있습니다.

테이블 컬럼

테이블 컬럼은 문자열을 그대로 넣는 것이 보통이지만, 특수 문자를 넣기 위해 홑따옴표 (') 또는 쌍따옴표 (") 로 감싸서 넣을 수도 있다.

Mach> CREATE TABLE special_tbl ( with.dot INTEGER );
[ERR-02010: Syntax error: near token (.dot INTEGER )).]
CREATE TABLE special_tbl ( "with.dot" INTEGER ); -- 가능
CREATE TABLE special_tbl ( 'with.dot' INTEGER ); -- 가능

해당 컬럼을 SELECT 쿼리를 통해 조회할 때도 홑따옴표 또는 쌍따옴표로 감싸야 하는데, 두 방법엔 차이가 존재한다.

  • 홑따옴표로 감싸게 되면, 컬럼이 아닌 String Literal 로 취급된다.
  • 쌍따옴표로 감싸게 되면, SELECT 쿼리 결과 컬럼의 이름 그대로 출력된다.
Mach> SELECT 'with.dot' FROM special_tbl;
'with.dot'
--------------
[0] row(s) selected.

Mach> SELECT "with.dot" FROM special_tbl;
with.dot
--------------
[0] row(s) selected.


테이블 프로퍼티(Table Property)

Table에 대한 속성을 지정한다.

프로퍼티 이름

사용 가능한 테이블 종류

CHECK_FORGERY

LOG TABLE

CHECK_FORGERY(Default:0)

Disk Column Table에 대해서만 지원되는 속성으로 Append된 데이터가 이후에 악의적으로 변경이 되었을 경우, Data의 변경 여부를 Check 할 수 있도록 한다. Check는 ALTER TABLE CHECK FORGERY RESULTFILE 구문을 참조하기 바란다.

컬럼 프로퍼티(Column Property)

Column에 대한 속성을 지정한다.

프로퍼티 이름

사용 가능한 테이블 종류

PART_PAGE_COUNT

LOG TABLE

PAGE_VALUE_COUNT

LOG TABLE

MAX_CACHE_PART_COUNT

LOG TABLE

MINMAX_CACHE_SIZE

LOG TABLE

PART_PAGE_COUNT

이 프로퍼티는 하나의 파티션이 가지는 Page의 개수를 나타낸다. 하나의 파티션이 가지는 Value의 개수는 PART_PAGE_COUNT * PAGE_VALUE_COUNT가 된다.


PAGE_VALUE_COUNT

이 프로퍼티는 하나의 Page가 가지는 Value의 개수를 나타낸다.


MAX_CACHE_PART_COUNT (Default : 0)

이 프로퍼티는 성능 향상을 위한 캐시 영역을 설정하는 것이다.

마크베이스 가 파티션에 접근할 때 해당 파티션의 메타 정보를 메모리에 담고 있는 구조체를 먼저 찾게 되는데, 몇 개의 파티션 정보를 메모리에 담고 있을지 결정한다. 크면 클수록 성능에 도움이 될 것이나, 메모리 사용량이 늘어난다. 최소값은 1 최대값은 65535이다.


MINMAX_CACHE_SIZE (Default : 10240)

이 프로퍼티는 해당 Column의 MINMAX를 위한 캐시 메모리를 얼마나 사용할 것인지 지정하는 것이다. 0번째 Hidden Column인 _ARRIVAL_TIME의 경우 기본적으로 100MB으로 지정이 된다. 하지만 다른 Column들은 기본적으로 10KB로 지정되어 있다. 이 크기는 Table의 생성 이후에도 "ALTER TABLE MODIFY" 구문을 통해서 이 값은 변경이 가능하다.


NOT NULL Constraint

컬럼 값에 NULL을 허용하지 않을 경우 NOT NULL을 지정하고, 허용할 경우(Default)에는 생략한다.

테이블 생성 이후에 정의된 이 제약조건을 삭제하거나 추가하기 위해서는 ALTER TABLE MODIFY COLUMN 명령으로 제약조건을 변경할 수 있다.

# 컬럼 c1은 not null로, c2는 not null 제약 조건 없이 생성한다. 
CREATE TABLE t1(c1 INTEGER NOT NULL, c2 VARCHAR(200));


Pre-defined System Columns

Create Table 문을 이용하여 테이블을 생성하면 시스템은 두 개의 사전 정의된 시스템 컬럼을 추가로 생성한다. _ARRIVAL_TIME 및 _RID컬럼이다.

_ARRIVAL_TIME 컬럼은 DATETIME 타입의 컬럼으로 INSERT 문이나 AppendData로 데이터를 삽입하는 시점의 시스템 time을 기준으로 삽입되며, 해당 값은 생성된 레코드의 unique key로 사용될 수 있다. 이 컬럼의 값은 순서가 보장되는 경우(과거-현재 순으로) machloader나 INSERT 문에서 값을 지정하여 삽입할 수 있다. DURATION 조건절을 이용하여 데이터를 검색할 경우, 이 컬럼의 값을 기준으로 데이터를 검색한다.

_RID 컬럼은 특정 레코드가 갖는 유일한 값으로 시스템이 생성한다. 이 컬럼의 데이터 타입은 64bit 정수이며, 이 컬럼에 대해서는 사용자가 값을 지정할 수 없고 인덱스도 생성할 수 없다. 데이터 INSERT시에 자동으로 생성된다. _RID 컬럼의 값으로 레코드를 검색할 수 있다.

create volatile table t1111 (i1 integer);
Created successfully.
Mach> desc t1111;

----------------------------------------------------------------
NAME                          TYPE                LENGTH        
----------------------------------------------------------------
_ARRIVAL_TIME                 datetime            8               
I1                            integer             4               

Mach>insert into t1111 values (1);
1 row(s) inserted.
Mach>select _rid from t1111;
_rid                 
-----------------------
0                    
[1] row(s) inserted.

Mach>select i1 from t1111 where _rid = 0;
i1          
--------------
1           
[1] row(s) selected.


MINMAX Cache 개념

일반적으로 Disk DBMS에서는 특정 값을 인덱스를 활용하여 검색할 경우 해당 인덱스가 포함된 디스크 영역에 대해 접근하고, 해당 값이 포함된 최종 디스크 페이지를 찾아가도록 구현되어 있다.

반면, 마크베이스는 시계열 정보를 유지하기 위해 시간순으로 파티션 되어있는 구조이며, 이것은 특정한 하나의 인덱스 정보가 시간순으로 조각조각의 파일로 나누어져 있다는 의미이다. 따라서, 마크베이스의 인덱스를 이용할 때는 이러한 파티션으로 조각나 있는 인덱스 파일을 순차적으로 검색한다.

만일 검색해야 할 대상 데이터의 범위가 1000개의 파티션으로 나뉘어져 있다면 1000번의 파일을 매번 열어서 검색해야 한다는 의미이다. 비록 효율적인 컬럼형 데이터베이스 구조로 설계되어 있긴 하나, 이러한 I/O 비용이 인덱스 파티션 개수의 크기에 비례하기 때문에 그 성능을 향상하기 위한 방법이 MINMAX_CACHE 구조이다.

이 MINMAX_CACHE는 해당 파티션의 인덱스 파일 정보를 메모리에 담고 있는 구조체로서 해당 컬럼의 최소 및 최대 값을 메모리에 유지하는 연속된 메모리 공간이다. 이런 구조를 유지함으로써 특정 값이 포함된 파티션을 검색할 경우 그 값이 해당 인덱스의 최소값 보다 작거나 최대 값보다 클 경우에는 아예 해당 파티션을 건너뛸 수 있기 때문에 고성능의 데이터 분석이 가능해진다.

위의 그림에서 볼 수 있듯이 85라는 값을 찾기 위해서 5개의 파티션 중에서 MIN/MAX에 포함된 1번과 5번 파티션만을 실제로 검색하게 되며, 2, 3, 4 번 파티션은 아예 건너뛰는 모습을 볼 수 있다.

MINMAX Cache 컬럼

테이블 생성 시에 특정 컬럼에 대해 MINMAX Cache를 사용할 것인지 결정할 수 있다.

만일 이 컬럼이 minmax_cache_size가 0이 아닌 값으로 설정되었으면, 해당 컬럼에 인덱스 검색 시 MINMAX Cache가 동작하게 되며, MINMAX_CACHE_SIZE = 0일 경우에는 동작하지 않는다.

이런 MINMAX Cache를 사용할 때 다음과 같은 사항에 주의한다.

  1. MINMAX Cache 는 해당 컬럼에 인덱스를 명시적으로 생성하지 않아도 적용된다.

  2. 모든 컬럼의 default는  MINMAX_CACHE_SIZE가 10KB로 설정되있고 Alter Table 구문을 활용하여 적정한 크기의 메모리 크기를 재설정할 수 있다.

  3. 숨어있는 컬럼인 _arrival_time은 디폴트로 100MB이며, 자동으로 MINMAX Cache 메모리를 사용한다.

  4. VARCHAR 타입의 경우에는 MINMAX Cache 의 대상이 되지 않는다. 따라서 VARCHAR 타입을 명시적으로 캐시 사용 여부를 지정하면, 에러가 발생한다.

  5. 해당 테이블이 하나 생성될 때 프로퍼티에 설정된  MINMAX_CACHE_SIZE 만큼 최대 메모리가 더 사용될 수 있다. 파티션 개수가 늘수록 메모리가 점진적으로 늘어나 위의 최대 메모리만큼 늘어난다.

  6. 만일 해당 테이블에 레코드가 하나도 들어있지 않으면, MINMAX Cache  메모리는 전혀 할당되지 않는다.

아래는 실제 MINMAX를 활용한 테이블 생성 예를 나타낸다.

-- VARCHAR에 대한 MINMAX_CACHE_SIZE = 0은 의미상으로 허용된다.
CREATE TABLE ctest (id INTEGER, name VARCHAR(100) PROPERTY(MINMAX_CACHE_SIZE = 0));
Created successfully.
Mach>

-- id 컬럼에 캐시가 적용되었다.
CREATE TABLE ctest2 (id INTEGER PROPERTY(MINMAX_CACHE_SIZE = 10240), name VARCHAR(100) PROPERTY(MINMAX_CACHE_SIZE = 0));
Created successfully.
Mach>

-- id1, id2, id3 컬럼에 적용되었다.
CREATE TABLE ctest3 (id1 INTEGER PROPERTY(MINMAX_CACHE_SIZE = 10240), name VARCHAR(100) PROPERTY(MINMAX_CACHE_SIZE = 0), id2 LONG PROPERTY(MINMAX_CACHE_SIZE = 1024), id3 IPV4 PROPERTY(MINMAX_CACHE_SIZE = 1024), id4 SHORT);
Created successfully.
Mach>

-- Column단위로 MINMAX_CACHE_SIZE가 지정되거나, 0으로 설정되었다.
CREATE TABLE ctest4 (id1 INTEGER PROPERTY(MINMAX_CACHE_SIZE=10240), name VARCHAR(100) PROPERTY(MINMAX_CACHE_SIZE=0), id2 LONG PROPERTY(MINMAX_CACHE_SIZE=10240), id3 IPV4 PROPERTY(MINMAX_CACHE_SIZE=0), id4 SHORT);
Created successfully.
Mach>


기본 키(Primary Key)

Volatile/Lookup 테이블의 컬럼에 부여할 수 있는 제약 사항으로, 해당 컬럼의 값이 중복되는 것을 방지한다. Volatile/Lookup 테이블이 항상 기본 키를 가지고 있을 필요는 없으나, 기본 키가 없으면 INSERT ON DUPLICATE KEY UPDATE 구문을 사용할 수 없다.

기본 키를 부여하면, 기본 키에 대응되는 레드-블랙 트리 인덱스가 생성된다.


AUTO_DEL 절(5.5 이후 버전에서 지원)

데이터의 양을 제한하여 디스크 저장 공간을 유지할 수 있다. Log 테이블에 대해서만 지원하며, CREATE TABLE문에서 Table property를 지정하기 전에 AUTO_DEL절을 이용하여 설정한다. AUTO_DEL절은 저장 시간 기준 혹은 레코드 수 기준으로 설정할 수 있다.

CREATE TABLE t1 (c1 INT) KEEP 30 DAY AFTER APPEND INTERVAL 5 SECOND;

위 예제는 자동 삭제가 수행된 이후 5초가 지나고 추가 입력이 있는 경우, 입력된지 30일이 지난 데이터를 삭제한다. interval로 지정된 기간이 길면 자동 delete가 수행되는 시간이 길어져서 입력에 영향을 끼칠 가능성이 있으며, 너무 짧으면 시스템 성능에 전체적으로 영향을 줄 수 있다.

아래의 예제는 보존할 데이터의 건 수로 자동 삭제 기능을 지정하는 예이다.

CREATE TABLE t1 (c1 INT) KEEP 3 RECORD AFTER APPEND INTERVAL 5 RECORD;

입력 데이터 5건 마다 해당 테이블의 레코드의 수를 검사하여 3건 이상이면 3건만 남기도록 자동 삭제를 수행한다.


CREATE TAG TABLE


create_tag_table_stmt:

tag_column_list:

create_tag_table_stmt ::= 'CREATE' 'TAGDATA' 'TABLE' table_name '(' tag_column_list ( 'metadata' '(' column_list ')' )? ')'
tag_column_list ::= column_name column_type column_property_list? 'PRIMARY KEY'? 'BASETIME'? 'SUMMARIZED'? 'NOT NULL'? ( ',' column_name column_typecolumn_property_list? 'PRIMARY KEY'? 'BASETIME'? 'SUMMARIZED'? 'NOT NULL'? )*

태그 테이블 생성시 반드시 primary key, basetime, summarized 가 들어가야 한다.

--예제
CREATE TAGDATA TABLE tag (name varchar(20) primary key, time datetime basetime, value double summarized); 
CREATE TAGDATA TABLE tag (name varchar(20) primary key, int_column int, time datetime basetime, value double summarized, value2 float);
CREATE TAGDATA TABLE tag (name varchar(20) primary key, time datetime basetime, value double summarized, value2 float) METADATA (i1 int); 

CREATE INDEX


create_index_stmt:

index_type:

table_space:

index_property_list:

create_index_stmt ::= 'CREATE' 'INDEX' index_name 'ON' table_name '(' column_name ')' index_type? table_space? index_property_list?
index_type ::= 'INDEX_TYPE' ( 'KEYWORD' | 'BITMAP' | 'REDBLACK' )
table_space ::= 'TABLESPACE' table_space_name
index_property_list ::= ( 'MAX_LEVEL' | 'PAGE_SIZE' | 'BLOOM_FILTER' | 'BITMAP_ENCODE' | 'PART_VALUE_COUNT' ) '=' value



Index Type

생성할 Index Type을 지정한다. Keyword Index가 아닌 경우 Index Type을 지정하지 않으면 Table Type에 따라서 Default Index Type으로 Index가 생성된다.

Table Type

Default Index Type

Volatile Table

REDBLACK

Lookup TableREDBLACK

Log Table

LSM

KEYWORD Index

텍스트 검색을 위한 인덱스로써 로그 테이블의 varchar와 text 컬럼에만 생성 가능하며, 단일 컬럼에 대해서만 생성할 수 있다.

LSM Index

LSM(Log Structure Merge) Index로 Big Data에 저장 및 검색에 최적화된 Index이다. LSM Index들의 Partition들은 Level 별로 유지되고 하위 Level의 Partition들이 Merge되어 상위 Level로 이동한다. 그리고 상위 Level의 Partition 생성에 사용된 하위 Partition들은 삭제된다.

이러한 Index Level Partition Building은 Background Thread 에 의해서 수행된다. 상위 Level Partition은 하위 Level의 Partition 들이 Merge되어 하나의 Partition으로 생성되기 때문에 Index를 통한 검색 시 다음과 같은 장점이 존재한다.

  1. Key가 중복된 경우, 한 번만 저장되기 때문에 Key 저장을 위한 Disk Space가 절약된다.

  2. 여러 개의 Partition에 대한 Searching보다 하나의 Index Partition에 대한 검색 시 File Open 및 Close 비용이 줄어들고, 접근하는 Index Page의 개수 또한 줄어든다.

LSM Index Property

항목

설명

MAX_LEVEL

(DEFAULT = 3, MIN = 0, MAX = 3 )

LSM Index의 최대 Level로서 현재 3이 최대값이다. 그리고 하나의 Partition의 최대 Record 건수는 2억건을 초과할 수 없다. 각 Level의 Partition 크기는 이전 Partition의 Value 개수 * 10이다. 예를 들면 MAX_LEVEL = 3, PART_VALUE_COUNT가 100,000 이면 Level 0 = 100,000, Level 1 = 1,000,0000, Level 2 = 10,000,000, Level 3 = 100,000,000 이다. 만약 마지막 Level의 Partition Size가 2억건을 초과하면 Index 생성이 실패한다.

PAGE_SIZE

(DEFAULT = 512 * 1024, MIN = 32 * 1024,

MAX = 1 * 1024 * 1024)

Index의 Key Value와 Bitmap 값이 저장되는 Page의 크기를 지정한다. Default는 512K이다.

BLOOM_FILTER

(DEFAULT = 1, DISABLE = 0, ENABLE(DEFAULT) = non_zero_integer)

인덱스에 Bloom filter를 설정할 것인지 아닌지를 설정한다. Bloom filter를 설정하면 인덱스에 존재하지 않는 값을 빠르게 검색할 수 있지만 인덱스 생성에 소요되는 시간이 증가한다.

Range 조건만을 사용하는 경우, Bloom filter는 이용할 수 없으므로 생성할 필요는 없다.

Bloom filter를 생성하지 않을 경우, BLOOM_FILTER = 0으로 설정해야 한다.

BITMAP_ENCODE

(DEFAULT = EQUAL, RANGE)

인덱스의 Bitmap 타입을 설정한다.

BITMAP_ENCODE=EQUAL(기본값)의 경우 키값과 같은 값에 대한 bitmap을 생성하고 BITMAP=RANGE인 경우 키값의 range에 따른 bitmap을 생성한다.

질의 조건으로 = 을 주로 사용하는 경우 BITMAP_ENCODE=EQUAL로, 특정 범위값을 질의 조건으로 주로 사용하는 경우 BITMAP_ENCODE=RANGE로 설정하는 편이 좋다.

BITMAP=RANGE인 경우 생성 비용은 EQUAL에 비해서 약간 증가한다.

BITMAP 인덱스

데이터 분석을 위한 인덱스로서, 로그 테이블에만 생성 가능하다. 그리고 varchar, text, binary를 제외한 모든 컬럼에 생성 가능하며, 단일 컬럼에 대해서만 생성할 수 있다.

RED-BLACK 인덱스

실시간 데이터 검색을 위한 메모리 인덱스로서, Volatile/Lookup 테이블에만 생성 가능하다. 그리고 이 테이블의 모든 컬럼에 생성 가능하며 단일 컬럼에 대해서만 생성할 수 있다.

Index Property

LSM Index 에서 적용할 수 있는 Property 는 다음과 같다.

PART_VALUE_COUNT

Index의 Partition에 저장되는 Row 개수를 나타낸다.

--예제
-- c1 컬럼에 index가 적용되었다.
CREATE INDEX index1 on table1 ( c1 )
-- varchar type의 var_column에 keyword index가 적용되고 page_size의 단위는 100000가 되었다.
CREATE INDEX index2 on table1 (var_column) INDEX_TYPE KEYWORD PAGE_SIZE=100000;



DROP TABLESPACE


drop_table_stmt:

drop_table_stmt ::= 'DROP TABLESPACE' tablespace_name

지정된 Tablespace를 삭제한다. 하지만 Tablespace에 생성된 객체가 존재하는 경우, 삭제가 실패한다.

--예제
DROP TABLESPACE TablespaceName;


DROP TABLE


drop_table_stmt:


drop_table_stmt ::= 'DROP TABLE' table_name

지정된 테이블을 삭제한다. 단, 해당 테이블을 검색 중인 다른 세션이 존재할 경우에는 에러를 내면서 실패한다.

--예제
DROP TABLE TableName;


DROP INDEX


drop_index_stmt:

drop_index_stmt ::= 'DROP INDEX' index_name

지정된 인덱스를 삭제한다. 단, 해당 테이블을 검색 중인 다른 세션이 존재할 경우에는 에러를 내면서 실패한다.

--예제
DROP INDEX IndexName;



ALTER TABLESPACE


ALTER TABLESPACE 구문은 지정된 Tablespace에 관련된 정보를 변경하는데 사용된다.

ALTER TABLESPACE MODIFY DATADISK

이 구문은 Tablespace의 DATADISK의 속성을 변경하는데 사용된다.

alter_tablespace_stmt:

alter_tablespace_stmt ::= 'ALTER TABLESPACE' table_name 'MODIFY DATADISK' disk_name 'SET' 'PARALLEL_IO' '=' value


-- 예제
ALTER TABLESPACE tbs1 MODIFY DATADISK disk1 SET PARALLEL_IO = 10;


ALTER TABLE


ALTER TABLE 구문은 지정된 테이블의 스키마 정보를 변경시키기 위한 용도로 사용되며 Log Table 만 사용 가능하다.


ALTER TABLE SET

이 구문은 Table의 Property를 변경하는 구문이다. 현재 동적으로 변경 가능한 Property는 없다.


ALTER TABLE ADD COLUMN

alter_table_add_stmt:

alter_table_add_stmt ::= 'ALTER TABLE' table_name 'ADD COLUMN' '(' column_name column_type ( 'DEFAULT' value )? ')'

이 구문은 테이블에 특정 컬럼을 실시간으로 추가하는 기능이다. 컬럼의 이름과 타입을 추가하고, DEFAULT 구문을 통해 기본 데이터 값을 설정할 수 있다.

-- 예제-1
alter table atest2 add column (id4 float);

-- 예제-2
alter table atest2 add column (id6 double  default 5);
alter table atest2 add column (id7 ipv4  default '192.168.0.1');
alter table atest2 add column (id8 varchar(4) default 'hello');


ALTER TABLE DROP COLUMN

alter_table_drop_stmt:

alter_table_drop_stmt ::= 'ALTER TABLE' table_name 'DROP COLUMN' '(' column_name ')'

이 구문은 테이블에 특정 컬럼을 실시간으로 삭제하는 기능이다.

-- 예제
alter table atest2 drop column (id4);
alter table atest2 drop column (id8);


ALTER TABLE RENAME COLUMN

alter_table_column_rename_stmt:

alter_table_column_rename_stmt ::= 'ALTER TABLE' table_name 'RENAME COLUMN' old_column_name 'TO' new_column_name

이 구문은 테이블의 특정 컬럼명을 변경하는 기능이다.

-- 예제
alter table atest2 rename column id7 to id7_rename;


ALTER TABLE MODIFY COLUMN

alter_table_modify_stmt:


alter_table_modify_stmt ::= 'ALTER TABLE' table_name 'MODIFY COLUMN' ( '(' column_name 'VARCHAR' '(' new_size ')' ')' | column_name ( 'NOT'? 'NULL' | 'SET' 'MINMAX_CACHE_SIZE' '=' value ) )

이 구문은 테이블의 특정 컬럼의 속성을 변경하는 것이다. 현재는 VARCHAR 타입의 컬럼 길이와 그외 타입에 대한 MINMAX CACHE 속성과 NOT NULL 제약조건을 수정하는 것이 가능하다.


VARCHAR SIZE

이 구문은 VARCHAR 타입의 컬럼 길이만 변경하는 것을 지원한다. 이 동작은 기존의 데이터를 보존하기 위해 그 길이가 줄어들 수는 없으며, 언제나 증가해야 한다.

ALTER TABLE table_name MODIFY COLUMN (column_name VARCHAR(new_size));


-- 예제 : TABLE 이 이렇게 만들어졌다고 가정하자.
-- create table atest5 (id integer, name varchar(5), id3 double, id4 float);

-- 에러 발생: 다른 타입으로 변경할 수 없음.
alter table atest5 modify column (id varchar(10));

-- 에러 발생: VARCHAR 길이를 더 작게 할 수 없음.
alter table atest5 modify column (name varchar(3));

-- 에러 발생: VARCHAR의 최대 크기 32767 이상 넘을 수 없음.
alter table atest5 modify column (name varchar(32768));

-- 성공 
alter table atest5 modify column (name varchar(128));


MINMAX_CACHE_SIZE

이 구문은 특정 컬럼에 대해 MINMAX_CACHE_SIZE를 변경한다.

ALTER TABLE table_name MODIFY COLUMN column_name SET MINMAX_CACHE_SIZE=value;


-- 예제 : TABLE 이 이렇게 만들어졌다고 가정하자.
create table atest9 (id integer, name varchar(100));

-- 에러: VARCHAR에는 적용 안됨.
alter table atest9 modify column name set minmax_cache_size=0;
[ERR-02139 : MINMAX CACHE is not allowed for VARCHAR column(NAME).]

-- 변경 성공
alter table atest9 modify column id set minmax_cache_size=10240;


NOT NULL

컬럼에 NOT NULL 제약 조건을 추가한다. NOT NULL 제약 조건을 추가할 경우 NULL값이 있는 컬럼에 대해서는 DDL연산이 실패한다.

만약 컬럼에 NULL값을 허용하고 싶은 경우에는 다음 절의 MODIFY COLUMN NULL 명령어를 이용한다.

ALTER TABLE table_name MODIFY COLUMN column_name NOT NULL;
-- t1.c1에 NOT NULL 제약조건을 추가한다.
alter table t1 modify column c1 not null;


NULL

NOT NULL 제약조건을 해제한다. LSM 인덱스의 min_max 캐시로 인한 성능 향상을 얻을 수 없다. NULL 값의 입력이 가능해 진다.

ALTER TABLE table_name MODIFY COLUMN column_name NULL;
-- t1.c1에 NOT NULL 제약조건을 해제한다. 
alter table t1 modify column c1 null;


ALTER TABLE FLUSH

alter_table_flush_stmt:

alter_table_flush_stmt ::= 'ALTER TABLE' table_name 'FLUSH'

지정한 table에 대한 입력 데이터가 데이터 파일에 완전히 반영될 때 까지 대기한다.


ALTER TABLE FLUSH INDEX

alter_table_flush_index_stmt:

alter_table_flush_index_stmt ::= 'ALTER TABLE' table_name 'FLUSH' 'INDEX' ( index_name | 'ALL' )


지정된 테이블의 인덱스 데이터가 인덱스 파일에 완전히 반영될 때까지 대기한다.

-- bulktable의 모든 인덱스에 대한 데이터가 인덱스 파일들에 반영될 때 까지 대기한다.
alter table bulktable flush index all;

-- bulktable의 c1_idx 인덱스의 데이터가 인덱스 파일에 반영될 때 까지 대기한다.
alter table bulktable flush index c1_idx;

ALTER TABLE CHECK FORGERY RESULT FILE

alter_table_check_forgery_stmt:

alter_table_check_forgery_stmt ::= 'ALTER TABLE' table_name 'CHECK FORGERY RESULTFILE' "'" result_filename "'"


지정된 테이블에 대해 Append된 이후 변경(Forgery)이 되었는지를 확인한다. Forgery Check는 Disk Column Table에 대해서만 지원이 되고, Disk Column Table 또한 생성시 FORGERY_CHECK 속성을 1로 설정하여 생성해야 한다. Forgery가 Detect되면 $MACHBASE_HOME/trc 밑에 result_filename에 해당하는 파일이 생성되고 해당 파일에 Table의 어느 부분이 변경 되었는지가 기록되어 있다.

-- t1 table에 대해서 forgery check를 수행한다.
alter table t1 check forgery resultfile 't1_forgery_check';


ALTER TABLE RENAME TO

alter_table_rename_stmt:

alter_table_rename_stmt ::= 'ALTER TABLE' table_name 'RENAME TO' new_name


테이블의 이름을 변경한다.

메타 테이블들은 이름을 변경할 수 없고, 변경될 이름에 $문자는 사용할 수 없다. 테이블 이름 변경은 log 테이블에 대해서만 가능하다.

-- user 테이블의 이름을 employee로 변경한다.
ALTER TABLE user RENAME TO employee

TRUNCATE TABLE


truncate_table_stmt:


truncate_table_stmt ::= 'TRUNCATE TABLE' table_name

-- ctest 테이블의 모든 데이터를 삭제한다.
Mach> truncate table ctest;
Truncated successfully.

지정된 테이블에 존재하는 모든 데이터를 삭제한다. 단, 해당 테이블을 검색 중인 다른 세션이 존재할 경우에는 에러를 내면서 실패한다.

  • No labels