Alias 테이블 엔진
Alias 테이블 엔진
Alias 엔진은 다른 테이블을 가리키는 프록시 역할을 하는 테이블을 만들어요. 모든 읽기·쓰기 연산이 대상(target) 테이블로 전달되며, alias 자체는 데이터를 저장하지 않고 대상 테이블에 대한 참조만 유지해요. 이렇게 하면 별칭 테이블의 스키마가 항상 대상 테이블과 일치하게 보장할 수 있답니다.
출처: 문서
본문
Alias 엔진은 다른 테이블에 대한 프록시를 만듭니다. 모든 읽기·쓰기 연산은 대상 테이블로 전달되며, alias 자체는 데이터를 저장하지 않고 대상 테이블에 대한 참조만 유지합니다.
테이블 생성 (Creating a Table)
CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_table)
또는 데이터베이스 이름을 명시적으로 지정할 수도 있어요:
CREATE TABLE [db_name.]alias_name
ENGINE = Alias(target_db, target_table)
Alias 테이블은 명시적인 컬럼 정의를 지원하지 않아요. 컬럼은 대상 테이블에서 자동으로 상속되며, 이를 통해 alias가 항상 대상 테이블의 스키마와 일치하도록 보장합니다.
엔진 매개변수 (Engine Parameters)
- target_db (선택) — 대상 테이블이 있는 데이터베이스의 이름. (optional)
- target_table — 대상 테이블의 이름.
target_db를 생략하고 target_table이 완전히 자격을 갖춘 이름(full qualified)이 아닐 때(예: Alias('my_table')), 대상은 세션의 현재 데이터베이스가 아니라 alias 자체와 같은 데이터베이스로 해석됩니다.
지원되는 연산 (Supported Operations)
Alias 테이블 엔진은 모든 주요 연산을 지원해요.
대상 테이블에 대한 연산 (Operations on Target Table)
이 연산들은 대상 테이블로 프록시됩니다:
| Operation | Support | Description |
|---|---|---|
| SELECT | ✅ | 대상 테이블에서 데이터 읽기 |
| INSERT | ✅ | 대상 테이블에 데이터 쓰기 |
| INSERT SELECT | ✅ | 대상 테이블에 일괄 삽입 |
| ALTER TABLE ADD COLUMN | ✅ | 대상 테이블에 컬럼 추가 |
| ALTER TABLE MODIFY SETTING | ✅ | 대상 테이블 설정 수정 |
| ALTER TABLE PARTITION | ✅ | 대상 테이블의 파티션 연산 (DETACH/ATTACH/DROP) |
| ALTER TABLE UPDATE | ✅ | 대상 테이블의 행 업데이트 (mutation) |
| ALTER TABLE DELETE | ✅ | 대상 테이블의 행 삭제 (mutation) |
| OPTIMIZE TABLE | ✅ | 대상 테이블 최적화 (part 병합) |
| TRUNCATE TABLE | ✅ | 대상 테이블 비우기 |
Alias 자체에 대한 연산 (Operations on Alias Itself)
이 연산들은 대상 테이블이 아닌 alias에만 영향을 미쳐요:
| Operation | Support | Description |
|---|---|---|
| DROP TABLE | ✅ | alias만 삭제, 대상 테이블은 그대로 |
| RENAME TABLE | ✅ | alias만 이름 변경, 대상 테이블은 그대로 |
사용 예시 (Usage Examples)
기본 Alias 생성 (Basic Alias Creation)
같은 데이터베이스에 간단한 alias를 만들어 볼게요:
-- Create source table
CREATE TABLE source_data (
id UInt32,
name String,
value Float64
) ENGINE = MergeTree
ORDER BY id;
-- Insert some data
INSERT INTO source_data VALUES (1, 'one', 10.1), (2, 'two', 20.2);
-- Create alias
CREATE TABLE data_alias ENGINE = Alias('source_data');
-- Query through alias
SELECT * FROM data_alias;
┌─id─┬─name─┬─value─┐
│ 1 │ one │ 10.1 │
│ 2 │ two │ 20.2 │
└────┴──────┴───────┘
데이터베이스 간 Alias (Cross-Database Alias)
다른 데이터베이스에 있는 테이블을 가리키는 alias를 만들어요:
-- Create databases
CREATE DATABASE db1;
CREATE DATABASE db2;
-- Create source table in db1
CREATE TABLE db1.events (
timestamp DateTime,
event_type String,
user_id UInt32
) ENGINE = MergeTree
ORDER BY timestamp;
-- Create alias in db2 pointing to db1.events
CREATE TABLE db2.events_alias ENGINE = Alias('db1', 'events');
-- Or using database.table format
CREATE TABLE db2.events_alias2 ENGINE = Alias('db1.events');
-- Both aliases work identically
INSERT INTO db2.events_alias VALUES (now(), 'click', 100);
SELECT * FROM db2.events_alias2;
Alias를 통한 쓰기 연산 (Write Operations Through Alias)
모든 쓰기 연산은 대상 테이블로 전달됩니다:
CREATE TABLE metrics (
ts DateTime,
metric_name String,
value Float64
) ENGINE = MergeTree
ORDER BY ts;
CREATE TABLE metrics_alias ENGINE = Alias('metrics');
-- Insert through alias
INSERT INTO metrics_alias VALUES
(now(), 'cpu_usage', 45.2),
(now(), 'memory_usage', 78.5);
-- Insert with SELECT
INSERT INTO metrics_alias
SELECT now(), 'disk_usage', number * 10
FROM system.numbers
LIMIT 5;
-- Verify data is in the target table
SELECT count() FROM metrics; -- Returns 7
SELECT count() FROM metrics_alias; -- Returns 7
스키마 수정 (Schema Modification)
ALTER 연산은 대상 테이블의 스키마를 수정합니다:
CREATE TABLE users (
id UInt32,
name String
) ENGINE = MergeTree
ORDER BY id;
CREATE TABLE users_alias ENGINE = Alias('users');
-- Add column through alias
ALTER TABLE users_alias ADD COLUMN email String DEFAULT '';
-- Column is added to target table
DESCRIBE users;
┌─name──┬─type───┬─default_type─┬─default_expression─┐
│ id │ UInt32 │ │ │
│ name │ String │ │ │
│ email │ String │ DEFAULT │ '' │
└───────┴────────┴──────────────┴────────────────────┘
데이터 변경 (Data Mutations)
UPDATE와 DELETE 연산이 지원됩니다:
CREATE TABLE products (
id UInt32,
name String,
price Float64,
status String DEFAULT 'active'
) ENGINE = MergeTree
ORDER BY id;
CREATE TABLE products_alias ENGINE = Alias('products');
INSERT INTO products_alias VALUES
(1, 'item_one', 100.0, 'active'),
(2, 'item_two', 200.0, 'active'),
(3, 'item_three', 300.0, 'inactive');
-- Update through alias
ALTER TABLE products_alias UPDATE price = price * 1.1 WHERE status = 'active';
-- Delete through alias
ALTER TABLE products_alias DELETE WHERE status = 'inactive';
-- Changes are applied to target table
SELECT * FROM products ORDER BY id;
┌─id─┬─name─────┬─price─┬─status─┐
│ 1 │ item_one │ 110.0 │ active │
│ 2 │ item_two │ 220.0 │ active │
└────┴──────────┴───────┴────────┘
파티션 연산 (Partition Operations)
파티셔닝된 테이블의 경우, 파티션 연산도 전달됩니다:
CREATE TABLE logs (
date Date,
level String,
message String
) ENGINE = MergeTree
PARTITION BY toYYYYMM(date)
ORDER BY date;
CREATE TABLE logs_alias ENGINE = Alias('logs');
INSERT INTO logs_alias VALUES
('2024-01-15', 'INFO', 'message1'),
('2024-02-15', 'ERROR', 'message2'),
('2024-03-15', 'INFO', 'message3');
-- Detach partition through alias
ALTER TABLE logs_alias DETACH PARTITION '202402';
SELECT count() FROM logs_alias; -- Returns 2 (partition 202402 detached)
-- Attach partition back
ALTER TABLE logs_alias ATTACH PARTITION '202402';
SELECT count() FROM logs_alias; -- Returns 3
테이블 최적화 (Table Optimization)
OPTIMIZE 연산은 대상 테이블의 part를 병합합니다:
CREATE TABLE events (
id UInt32,
data String
) ENGINE = MergeTree
ORDER BY id;
CREATE TABLE events_alias ENGINE = Alias('events');
-- Multiple inserts create multiple parts
INSERT INTO events_alias VALUES (1, 'data1');
INSERT INTO events_alias VALUES (2, 'data2');
INSERT INTO events_alias VALUES (3, 'data3');
-- Check parts count
SELECT count() FROM system.parts
WHERE database = currentDatabase()
AND table = 'events'
AND active;
-- Optimize through alias
OPTIMIZE TABLE events_alias FINAL;
-- Parts are merged in target table
SELECT count() FROM system.parts
WHERE database = currentDatabase()
AND table = 'events'
AND active; -- Returns 1
Alias 관리 (Alias Management)
Alias는 독립적으로 이름을 바꾸거나 삭제할 수 있어요:
CREATE TABLE important_data (
id UInt32,
value String
) ENGINE = MergeTree
ORDER BY id;
INSERT INTO important_data VALUES (1, 'critical'), (2, 'important');
CREATE TABLE old_alias ENGINE = Alias('important_data');
-- Rename alias (target table unchanged)
RENAME TABLE old_alias TO new_alias;
-- Create another alias to same table
CREATE TABLE another_alias ENGINE = Alias('important_data');
-- Drop one alias (target table and other aliases unchanged)
DROP TABLE new_alias;
SELECT * FROM another_alias; -- Still works
SELECT count() FROM important_data; -- Data intact, returns 2