SQLite 테이블 엔진

SQLite 테이블 엔진

이 엔진은 SQLite로 데이터를 가져오고 내보낼 수 있으며 ClickHouse에서 직접 SQLite 테이블에 대한 쿼리를 지원해요.

출처: 문서

본문

테이블 생성하기

    CREATE TABLE [IF NOT EXISTS] [db.]table_name
    (
        name1 [type1],
        name2 [type2], ...
    ) ENGINE = SQLite('db_path', 'table')

엔진 매개변수

  • db_path — 데이터베이스가 있는 SQLite 파일의 경로
  • table — SQLite 데이터베이스의 테이블 이름, 또는 SQLite에 그대로 전달되는 쿼리(테이블 이름 대신 쿼리 전달 참고)

테이블 이름 대신 쿼리 전달하기

테이블 이름 대신 table 인자는 SQLite에 그대로 전달되는 SELECT 쿼리일 수 있어요. 테이블 구조는 쿼리 결과에서 추론돼요. 쿼리는 서브쿼리로 쓰거나 query 함수로 감쌀 수 있어요.

CREATE TABLE sqlite_table ENGINE = SQLite('sqlite.db', (SELECT col1, col2 FROM table1 WHERE col2 > 1));
CREATE TABLE sqlite_table ENGINE = SQLite('sqlite.db', query('SELECT col1, col2 FROM table1 WHERE col2 > 1'));

이런 테이블은 읽기 전용이에요: INSERT가 허용되지 않아요. 같은 문법은 sqlite 테이블 함수에서도 지원돼요.

서브쿼리 형식 (SELECT ...)는 ClickHouse가 파싱하고 SQLite로 보내기 전에 재직렬화해요. 따라서 유효한 ClickHouse SQL이어야 해요. ClickHouse가 파싱하지 않는 SQLite 고유 문법을 전달하려면 query('...') 형식을 사용하는데, 그 텍스트는 SQLite에 그대로 전송돼요.

주변 ClickHouse 쿼리의 외부 WHERE, LIMIT, 집계 등은 전달된 쿼리로 푸시다운되지 않아요 — 전체 쿼리 결과를 가져온 뒤 ClickHouse에서 적용돼요. SQLite에서 읽는 데이터를 제한하려면 필터를 전달된 쿼리 안에 넣어요. external_table_strict_query = 1이면 이 테이블의 컬럼에 대한 외부 필터는 로컬로 적용되는 대신 예외로 거부돼요. 전달된 쿼리로 푸시할 수 없기 때문이에요. 이 검사는 최상위 WHERE 조건과 최상위 AND의 각 결합(conjunct)을 다뤄요. 이 테이블의 컬럼에 대한 PREWHERE는 이 설정의 대상이 아니에요: 이 테이블 엔진은 PREWHERE를 지원하지 않으며, 설정과 관계없이 그런 쿼리는 ILLEGAL_PREWHERE로 거부돼요. 검사는 필터를 푸시다운할 수 있는 곳에서만 실행돼요: 이 테이블이 쿼리의 유일한 테이블일 때, INNER JOIN의 어느 쪽일 때, 또는 외부 조인의 보존(preserving) 쪽(LEFT JOIN의 왼쪽, RIGHT JOIN의 오른쪽)일 때요. LEFT/RIGHT JOIN의 비보존 쪽과 FULL JOIN의 어느 쪽에서는 아무것도 푸시다운되지 않고 검사도 되지 않으므로, 이 테이블의 컬럼에 대한 필터는 strict 모드에서도 조인 후 로컬로 적용돼요. 검사가 실행되는 곳에서 주변 쿼리에 조인된 다른 테이블을 참조하는 조건은 푸시다운되지 않고 검사에서 제외돼요. 조인된 쪽만 참조하든 OR 같은 하나의 비-AND 표현식 안에서 이 테이블과 섞든 상관없이요. 그런 조건은 평소 ClickHouse 평가 시점(조인 후 WHERE, 그 전 PREWHERE)을 유지하고 거부되지 않아요.

데이터 타입 지원

테이블 정의에서 ClickHouse 컬럼 타입을 명시적으로 지정하면 SQLite TEXT 컬럼에서 다음 ClickHouse 타입을 파싱할 수 있어요.

기본 타입 매핑은 SQLite 데이터베이스 엔진을 참고해요.

사용 예시

SQLite 테이블을 만드는 쿼리를 보여줘요.

SHOW CREATE TABLE sqlite_db.table2;
CREATE TABLE SQLite.table2
(
    `col1` Nullable(Int32),
    `col2` Nullable(String)
)
ENGINE = SQLite('sqlite.db','table2');

테이블에서 데이터 반환:

SELECT * FROM sqlite_db.table2 ORDER BY col1;
┌─col1─┬─col2──┐
│    1 │ text1 │
│    2 │ text2 │
│    3 │ text3 │
└──────┴───────┘

함께 보기

더 알아보기 (Learn more)