Log 테이블 엔진

Log 테이블 엔진

이 엔진은 Log 엔진 패밀리에 속해요. Log 엔진의 공통 속성과 차이점은 Log 엔진 패밀리 문서를 참고해요.

LogTinyLog와 달리 컬럼 파일과 함께 작은 "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  │
└─────────────────────┴──────────────┴────────────────────────────┘

더 알아보기 (Learn more)