CREATE DATABASE
CREATE DATABASE
새로운 데이터베이스를 만들어요.
출처: 문서
본문
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)] [SETTINGS ...] [COMMENT 'Comment']
Clauses
IF NOT EXISTS
db_name 데이터베이스가 이미 존재하면 ClickHouse는 새 데이터베이스를 만들지 않고:
- 절이 지정되면 예외를 던지지 않아요.
- 절이 지정되지 않으면 예외를 던져요.
ON CLUSTER
ClickHouse는 지정된 클러스터의 모든 서버에 db_name 데이터베이스를 만들어요. 자세한 내용은 Distributed DDL 문서에서 확인할 수 있어요.
ENGINE
기본적으로 ClickHouse는 자체 Atomic 데이터베이스 엔진을 사용해요. MySQL, PostgresSQL, MaterializedPostgreSQL, Replicated, SQLite도 있습니다.
COMMENT
데이터베이스를 만들 때 주석을 추가할 수 있어요.
주석은 모든 데이터베이스 엔진에서 지원됩니다.
Syntax
CREATE DATABASE db_name ENGINE = engine(...) COMMENT 'Comment'
Example
CREATE DATABASE db_comment ENGINE = Memory COMMENT 'The temporary database';
SELECT name, comment FROM system.databases WHERE name = 'db_comment';
┌─name───────┬─comment────────────────┐
│ db_comment │ The temporary database │
└────────────┴────────────────────────┘
SETTINGS
SETTINGS 절은 ENGINE 절 없이 사용할 수 있어요. 이 경우 기본 데이터베이스 엔진(Atomic)이 사용됩니다. 데이터베이스 엔진의 설정과 일반 쿼리 설정을 모두 담을 수 있으며, 각 이름은 둘 중 속하는 쪽으로 전달됩니다.
disk
데이터베이스의 테이블 메타데이터 파일을 저장하는 데 사용되는 디스크예요. 서버 구성의 디스크 이름을 지정하거나, 단일 테이블과 마찬가지로 disk 함수로 인라인으로 정의할 수 있어요:
CREATE DATABASE db_name SETTINGS disk = 'db_disk';
CREATE DATABASE db_name SETTINGS disk = disk(type = 'local', path = '/var/lib/clickhouse-disks/db_disk');
테이블 메타데이터를 디스크에 저장하는 데이터베이스 엔진(Atomic, Ordinary)에 적용돼요. 지정하지 않으면 database_disk.disk 서버 설정에 정의된 디스크가 사용됩니다.
lazy_load_tables
활성화하면 데이터베이스 시작 중에 테이블이 완전히 로드되지 않아요. 대신 각 테이블에 대해 가벼운 프록시가 만들어지고 첫 접근 시 실제 테이블 엔진이 매터리얼라이즈됩니다. 이렇게 하면 많은 테이블이 있고 그중 일부만 활발하게 쿼리되는 데이터베이스에서 시작 시간과 메모리 사용량이 줄어들어요.
CREATE DATABASE db_name ENGINE = Atomic SETTINGS lazy_load_tables = 1;
테이블 메타데이터를 디스크에 저장하는 데이터베이스 엔진(예: Atomic, Ordinary)에 적용돼요. 뷰, 머티리얼라이즈드 뷰, 딕셔너리, Alias 테이블, TimeSeries 테이블, 그리고 테이블 함수로 뒷받침되는 테이블은 이 설정과 관계없이 항상 즉시 로드됩니다.
언제 사용할까: 이 설정은 많은 수의 테이블(수백 또는 수천 개)이 있고 그중 일부만 활발하게 쿼리되는 데이터베이스에 유용해요. 테이블 엔진 객체 생성, 데이터 파트 스캔, 백그라운드 스레드 초기화를 첫 접근 때까지 지연함으로써 서버 시작 시간과 메모리 사용량을 줄입니다.
system.tables에 미치는 영향:
- 테이블에 접근하기 전에
system.tables는 그 엔진을TableProxy로 보여줘요. 첫 접근 후에는 실제 엔진 이름(예:MergeTree)을 보여줍니다. total_rows와total_bytes같은 컬럼은 아직 실제 저장소가 생성되지 않았기 때문에 로드되지 않은 테이블에 대해NULL을 반환해요.
DDL 연산과의 상호작용:
SELECT,INSERT,ALTER,DROP는 첫 사용 시 투명하게 실제 테이블 엔진 로드를 트리거해요.RENAME TABLE은 로드를 트리거하지 않고 동작해요.- 테이블이 한 번 로드되면 서버 프로세스 수명 동안 로드된 상태를 유지해요.
제한 사항:
system.tables메타데이터(예:total_rows,engine)에 의존하는 모니터링 도구는 로드되지 않은 테이블에 대해 불완전한 정보를 볼 수 있어요.- 로드되지 않은 테이블에 대한 첫 쿼리는 일회성 로드 비용(저장된
CREATE TABLE문을 파싱하고 엔진을 초기화하는)을 발생시켜요.
기본값: 0(비활성화).