1. SQL Reference

IRIS 에서 사용가능한 SQL 문법을 설명합니다.

1.1. DDL

1.1.1. CREATE TABLE

create_table_stmt : CREATE TABLE STRING LPAREN table_schema RPAREN table_value

table_schema : column_define_list table_constraint_list

table_value : DATASCOPE STRING RAMEXPIRE value DISKEXPIRE value
              PARTITIONKEY value PARTITIONDATE value PARTITIONRANGE value

column_define_list : column_define
                   | column_define_list COMMA column_define

table_constraint_list : empty
                      | COMMA table_constraint_stmt
                      | COMMA table_constraint_stmt table_constraint_list

table_constraint_stmt : PRIMARY KEY LPAREN indexed_column_list RPAREN
                      | UNIQUE LPAREN indexed_column_list RPAREN

indexed_column_list : indexed_column
                    | indexed_column COMMA indexed_column_list

indexed_column : column_name
               | column_name ASC
               | column_name DESC

column_define : column_name column_type column_constraint_list

column_type : TEXT
            | REAL
            | INTEGER

column_constraint_list : column_constraint
                       | column_constraint_list column_constraint
                       | empty

order_type : empty
           | ASC
           | DESC

column_constraint : NOT NULL
                  | DEFAULT value
                  | UNIQUE
                  | PRIMARY KEY autoincrement

autoincrement : AUTOINCREMENT
              | empty

일반적인 CREATE SQL 아래에 IRIS 테이블 옵션이 추가됩니다.

테이블 옵션은 모두 설정해야 합니다. 테이블 옵션의 설명은 아래에 소개되어 있습니다.

아래의 예시는 IRIS의 local table을 만드는 예시입니다.

CREATE TABLE LOCAL_TEST_TABLE (
   k         TEXT,
   p         TEXT,
   a         TEXT
)
datascope       LOCAL
ramexpire       30
diskexpire      34200
partitionkey    k
partitiondate   p
partitionrange  10
;

1.1.1.1. IRIS 테이블 옵션

IRIS에서는 테이블을 생성시 테이블의 타입 및 보관 주기등을 설정해 주어야 합니다.

  • datascope : 데이터 저장 방식 설정 [ LOCAL OR GLOBAL ]

  • ramexpire : 램에 저장하는 시간 [ GLOBAL 테이블일 경우 0 ]

  • diskexpire : 디스크에 저장하는 시간 [ GLOBAL 테이블 경우 0 ]

  • partitionkey : KEY 로 사용할 값이 저장되는 컬럼 [ GLOBAL 테이블 경우 None ]

  • partitiondate : PARTITION으로 사용할 값이 저장되는 컬럼 [ GLOBAL 테이블 경우 None ]

  • partitionrange : 하나의 PARTITION 이 가지는 범위 [ GLOBAL 테이블 경우 0 ]

1.1.1.2. 지원하는 column-constraint

  • PRIMARY KEY [|ASC|DESC] [AUTOINCREMENT]

    GLOBAL TABLE 에서만 정상동작합니다.
    PRIMARY KEY 는 NULL 을 허용합니다. DESC 옵션은 현재 정상지원하지 않으며 ASC와 동일하게 동작합니다. 모든 컬럼타입에서 동작합니다.
  • INTEGER PRIMARY KEY 컬럼

    INTEGER PRIMARY KEY 컬럼은 기본적으로 값증가기능(autoincrement)이 적용되어 있습니다.

    정수형 데이터만 insert, update가 가능합니다. (예외로, NULL 값을 insert 하는 경우 키값을 생성해서 (현재 최대값+1) 넣습니다. 이외의 경우에는 datatype mismatch 오류를 출력합니다.)

    AUTOINCREMENT 옵션은 INTEGER PRIMARY KEY 컬럼 만 가능합니다.

    INTEGER PRIMARY KEY 컬럼에 AUTOINCREMENT 옵션을 넣으면 키값 생성 알고리즘이 변경되어 키값의 “monotonically increasing” 이 보장됩니다.

    AUTOINCREMENT 옵션 없을때 : 다음 키값이 키값의 최대값(9223372036854775807)을 넘으면 임의(랜덤)의 수를 현재 최대키값으로 잡고 다음 키값을 생성합니다. (unique 속성 보장)

    AUTOINCREMENT 옵션 있을때 : 다음 키값이 키값의 최대값(9223372036854775807)을 넘으면 ”database or disk is full” 오류메세지를 출력합니다.

    AUTOINCREMENT 옵션은 ASC 또는 공백만 허용합니다. (공백이면 ASC로 설정합니다.)

  • DEFAULT {default-value}

    컬럼 기본값을 설정합니다.

  • NOT NULL

    NULL 값이 들어오면 오류를 발생합니다. LOAD 작업시, 해당되는 데이터는 무시되고 나머지 데이터만 저장됩니다.

  • UNIQUE

    중복값이 들어오면 오류를 발생합니다. GLOBAL TABLE 에서만 정상동작합니다.

1.1.1.3. 지원하는 table-constraint

  • PRIMARY KEY ( ColumnName [, ColumnName] )

    GLOBAL TABLE 에서만 정상동작합니다.

    각 테이블별로 PRIMARY KEY 설정은 한 번만 할 수 있습니다. (위의 column-constraint 에서 이미 PRIMARY KEY 를 설정했다면 table-constraint 에서 설정할 수 없습니다.)

    PRIMARY KEY 는 NULL 을 허용합니다.

  • UNIQUE ( ColumnName [, ColumnName] )

    GLOBAL TABLE 에서만 정상동작합니다.

1.1.2. DROP TABLE

drop_table_stmt : DROP TABLE if_exists STRING

테이블을 삭제합니다.

LOCAL 테이블을 삭제하면, 쿼리 실행시에는 메타데이터만 삭제하며 실제 파일은 백그라운드에서 삭제합니다.

아래는 LOCAL_TEST_TABLE 을 삭제하는 예제입니다.

DROP TABLE LOCAL_TEST_TABLE;

1.1.3. CREATE INDEX

create_index_stmt : CREATE INDEX STRING ON STRING LPAREN indexed_column_list RPAREN
                  | CREATE UNIQUE INDEX STRING ON STRING LPAREN indexed_column_list RPAREN

indexed_column_list : indexed_column
                    | indexed_column COMMA indexed_column_list

indexed_column : column_name
               | column_name ASC
               | column_name DESC

인덱스를 생성합니다. GLOBAL테이블의 경우에는 해당 명령어를 그대로 사용하시면 됩니다.

하지만, LOCAL테이블의 경우에는 해당 명령어를 사용하면 존재하는 모든 데이터에 대해서 인덱스를 생성하게 됩니다.

따라서 데이터가 많이 저장되어 있을 경우 서비스에 장애가 발생할 수도 있습니다.

따라서 새로 저장되는 데이터부터 인덱스를 생성하는 것이 안전하며, 방법은 DotCommand인 .table index –add 를 사용하면 됩니다.

use DDL:
CREATE INDEX LOCAL_TEST_TABLE_IDX ON LOCAL_TEST_TABLE (a desc);

use DotCommand:
.table index --add LOCAL_TEST_TABLE_IDX LOCAL_TEST_TABLE (a desc)
.table index --add {index_name} {table_name} ({column_name) [DESC | ASC] {, column_name [DESC | ASC]}})

1.1.4. DROP INDEX

drop_index_stmt : DROP INDEX if_exists STRING

인덱스를 삭제합니다. GLOBAL테이블의 경우에는 해당 명령어를 그대로 사용하시면 됩니다.

하지만, LOCAL테이블의 경우에는 해당 명령어를 사용하면 존재하는 모든 데이터에 대해서 인덱스를 삭제하게 됩니다.

따라서 데이터가 많이 저장되어 있을 경우 서비스에 장애가 발생할 수도 있습니다.

따라서 새로 저장되는 데이터부터 인덱스를 삭제하는 것이 안전하며, 방법은 DotCommand인 .table index –del 를 사용하면 됩니다.

use DDL:
DROP INDEX LOCAL_TEST_TABLE_IDX;

use DotCommand:
.table index --del LOCAL_TEST_TABLE_IDX LOCAL_TEST_TABLE
.table index --del {index_name} {table_name}

1.1.5. ALTER TABLE

alter_table_stmt : ALTER TABLE table_name ADD COLUMN column_define

테이블 스키마를 변경합니다. 해당 명령어로는 컬럼 추가만 가능합니다.

때문에 GLOBAL로 생성된 테이블의 경우에는 컬럼 추가만 가능합니다.

하지만 LOCAL로 생성된 테이블의 경우에는 기존 데이터는 무시하고, 새로 저장되는 데이터부터 새로운 스키마를 적용하고 싶을 경우에는 DotCommand의 .table schema –edit 명령어를 사용하면 됩니다.

LOCAL테이블에 alter table을 사용할 경우에는 모든 데이터의 스키마를 변경하기 때문에 서비스 장애가 발생할 수도 있습니다.

1.2. DML

1.2.1. INSERT

insert_statement : INSERT INTO STRING LPAREN column_list RPAREN VALUES
                   LPAREN param_list RPAREN

column_list : column_name
            | column_name COMMA column_list

param_list : param COMMA param_list
           | param

param : expr
      | value
      | STAR

하나의 레코드를 추가합니다.

Local 테이블에 INSERT를 사용한 경우 key와 partition 값은 테이블 생성시 설정한 컬럼의 값을 사용합니다.

아래의 예시에서 LOCAL_TEST_TABLE은 k : keypartition, p : datepartition 로 생성되었습니다.

INSERT INTO LOCAL_TEST_TABLE (k, p, a) VALUES ('k2', '20110616000000', '1');

1.2.2. UPDATE

update_statement : UPDATE table_name SET update_column_list where_expression

update_column_list : update_column
                   | update_column COMMA update_column_list

update_column : column_name EQ expr

특정 컬럼을 사용자가 원하는 값으로 변경합니다.

아래는 LOCAL_TEST_TABLE의 a 컬럼을 ‘update’로 변경하는 예제입니다.

UPDATE LOCAL_TEST_TABLE SET a = 'update';

1.2.3. DELETE

delete_statement : DELETE FROM table_name where_expression

WHERE 절 조건에 맞는 데이터를 삭제합니다.

아래는 LOCAL_TEST_TABLE중 a 컬럼이 ‘update’인 레코드를 삭제하는 예제입니다.

DELETE FROM LOCAL_TEST_TABLE WHERE a = 'update';

1.2.4. SELECT 쿼리

select_statement : SELECT result_expression FROM table_expression where_expression
                   group_by_expression compound_op_select order_by_expression
                   limit_expression

result_expression : result_column
                  | result_column COMMA result_expression

result_column : STAR
              | column_name
              | alias_expression
              | term
              | expr

alias_expression : expr STRING
                 | expr AS STRING
                 | LPAREN select_statement RPAREN STRING
                 | LPAREN select_statement RPAREN AS STRING

table_expression : table_list

table_list : table_name
           | table_name join_expr_list

join_expr_list : join_expr join_expr_list
               | join_expr

join_expr : empty
          | join_op table_name join_args

join_op : COMMA
        | INNER JOIN
        | LEFT OUTER JOIN

join_args : ON expr
          | empty

where_expression : [where] expr
                 | empty

group_by_expression : GROUP BY result_expression
                    | empty

compound_op_select : compound_op select_core
                   | empty

compound_op : UNION
            | UNION ALL
            | INTERSECT
            | EXCEPT

order_by_expression : ORDER BY order_by_result_expression
                    | empty

order_by_result_expression : result_column
                           | result_column ASC
                           | result_column DESC
                           | result_column COMMA order_by_result_expression
                           | result_column ASC COMMA order_by_result_expression
                           | result_column DESC COMMA order_by_result_expression

limit_expression : ideallimit_expression
                 | mlimit_expression
                 | dlimit_expression

ideallimit_expression : LIMIT NUMBER
                      | LIMIT NUMBER COMMA NUMBER
                      | empty

mlimit_expression : MLIMIT NUMBER
                  | MLIMIT NUMBER COMMA NUMBER
                  | empty

dlimit_expression : DLIMIT NUMBER
                  | DLIMIT NUMBER COMMA NUMBER
                  | empty

LOCAL 테이블에 대한 쿼리를 실행할 때에는 LOCATION HINT 를 반드시 사용하세요.

아래는 검색 쿼리의 기본 예제 입니다.

예시)
/*+ BYPASS, LOCATION (KEY = 'k1' AND PARTITION >= '20150101000000'
AND PARTITION < '20150102000000') */
SELECT * FROM LOCAL_TEST_TABLE;

/*+ LOCATION (PARTITION >= '20150101000000' AND PARTITION < '20150102000000') */
SELECT sum(a) / count(a) FROM LOCAL_TEST_TABLE WHERE a > 10;

1.2.4.1. 유의사항

[*] 컬럼 사용에 제약사항이 있습니다.

  • Table Alias 를 지원하지 않습니다.

    FAIL : select a.* from (select * from X) a;
    
  • 단일 테이블을 사용한 에서만 사용할 수 있습니다.

    FAIL : select * from X, Y;