Log 테이블 엔진
Log 테이블 엔진
이 엔진은 Log 엔진 패밀리에 속해요. Log 엔진의 공통 속성과 차이점은 Log 엔진 패밀리 문서를 참고해요.
Log는 TinyLog와 달리 컬럼 파일과 함께 작은 "marks" 파일이 있다는 점에서 달라요. 이 marks는 모든 데이터 블록에 기록되며, 지정된 행 수를 건너뛰기 위해 파일을 어디서부터 읽어야 하는지 나타내는 오프셋을 포함해요. 이 덕분에 테이블 데이터를 여러 스레드로 읽을 수 있어요.
동시 데이터 접근을 위해 읽기 연산은 동시에 수행될 수 있지만, 쓰기 연산은 읽기와 서로를 차단해요.
Log 엔진은 인덱스를 지원하지 않아요. 마찬가지로, 테이블에 쓰기가 실패하면 테이블이 손상되고 읽기가 오류를 반환해요. Log 엔진은 임시 데이터, 한 번 쓰는 테이블(write-once), 테스트나 데모 목적에 적합해요.
출처: 문서
본문
테이블 생성하기
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
column1_name [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
column2_name [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = Log
CREATE TABLE 쿼리에 대한 자세한 설명은 해당 문서를 참고해요.
데이터 쓰기
Log 엔진은 각 컬럼을 자체 파일에 써서 데이터를 효율적으로 저장해요. 모든 테이블에 대해 Log 엔진은 지정된 저장 경로에 다음 파일을 써요.
<column>.bin: 직렬화·압축된 데이터를 포함하는 각 컬럼의 데이터 파일__marks.mrk: 삽입된 각 데이터 블록의 오프셋과 행 수를 저장하는 marks 파일. Marks는 엔진이 읽기 중 관련 없는 데이터 블록을 건너뛸 수 있게 해 효율적인 쿼리 실행을 돕는 데 사용돼요
쓰기 과정
Log 테이블에 데이터를 쓸 때:
- 데이터가 직렬화·압축되어 블록으로 만들어져요
- 각 컬럼에 대해 압축된 데이터가 해당
<column>.bin파일에 추가돼요 - 새로 삽입된 데이터의 오프셋과 행 수를 기록하기 위해
__marks.mrk파일에 해당 항목이 추가돼요
데이터 읽기
marks 파일 덕분에 ClickHouse는 데이터 읽기를 병렬화할 수 있어요. 이는 SELECT 쿼리가 예측할 수 없는 순서로 행을 반환한다는 뜻이에요. 행을 정렬하려면 ORDER BY 절을 사용해요.
사용 예시
테이블 생성:
CREATE TABLE log_table
(
timestamp DateTime,
message_type String,
message String
)
ENGINE = Log
데이터 삽입:
INSERT INTO log_table VALUES (now(),'REGULAR','The first regular message')
INSERT INTO log_table VALUES (now(),'REGULAR','The second regular message'),(now(),'WARNING','The first warning message')
두 개의 INSERT 쿼리를 사용해 <column>.bin 파일 내부에 두 개의 데이터 블록을 만들었어요. ClickHouse는 데이터를 선택할 때 여러 스레드를 사용해요. 각 스레드는 별도의 데이터 블록을 읽고 끝나면 결과 행을 독립적으로 반환해요. 결과적으로 출력의 행 블록 순서가 입력의 같은 블록 순서와 일치하지 않을 수 있어요. 예:
SELECT * FROM log_table
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘
┌───────────timestamp─┬─message_type─┬─message───────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
└─────────────────────┴──────────────┴───────────────────────────┘
결과 정렬(기본 오름차순):
SELECT * FROM log_table ORDER BY timestamp
┌───────────timestamp─┬─message_type─┬─message────────────────────┐
│ 2019-01-18 14:23:43 │ REGULAR │ The first regular message │
│ 2019-01-18 14:27:32 │ REGULAR │ The second regular message │
│ 2019-01-18 14:34:53 │ WARNING │ The first warning message │
└─────────────────────┴──────────────┴────────────────────────────┘