在 ClickHouse 中查看 table
VIEW on a table in ClickHouse
我正在研究 ClickHouse 的 VIEW、MATERIALIZED VIEW 和 LIVE VIEW。
MATERIALIZED VIEW 和 LIVE VIEW 在 official docs 中有很好的描述。
但是,table 描述中的 VIEW 是有限的。
来自官方文档:
As an example, assume you’ve created a view:
CREATE VIEW view AS SELECT ...
and written a query:
SELECT a, b, c FROM view
但它没有指定table 我们正在做的 SELECT 引擎支持哪些 table 引擎。此外,没有使用示例。
您能否提供一个 VIEW 的最小使用示例,并解释初始 table 支持哪些 table 引擎?
关于 VIEW 和 MATERIALIZED VIEW 类型之间的区别,我找到了这个针对 Oracle 的答案,看起来它也可以应用于 ClickHouse What is the difference between Views and Materialized Views in Oracle?。
编辑:在评论中添加了来自 link 测试的一些基本示例:
示例 1
DROP TABLE IF EXISTS union;
create view union as select 1 as test union all select 2;
SELECT * FROM union ORDER BY test;
DETACH TABLE union;
ATTACH TABLE union;
SELECT * FROM union ORDER BY test;
DROP TABLE union;
示例 2:
DROP VIEW IF EXISTS test_view;
DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table
(
f1 Int32,
f2 Int32,
pk Int32
)
ENGINE = MergeTree()
ORDER BY f1
PARTITION BY pk;
CREATE VIEW test_view AS
SELECT f1, f2
FROM test_table
WHERE pk = 2;
INSERT INTO test_table (f1, f2, pk) VALUES (1,1,1), (1,1,2), (2,1,1), (2,1,2);
SELECT * FROM test_view ORDER BY f1, f2;
ALTER TABLE test_view DELETE WHERE pk = 2; --{serverError 48}
SELECT * FROM test_view ORDER BY f1, f2;
DROP VIEW IF EXISTS test_view;
DROP TABLE IF EXISTS test_table;
视图只是一个保存的查询,仅此而已。
由于在查询 table 时没有指定 table 引擎,因此不需要为视图指定引擎。您甚至可以组合多个 table,每个具有不同的 table 引擎。
因此,您不必一直发出长查询,而是可以为该查询创建一个视图,这反过来会添加一个抽象层来帮助您简化查询。
假设你有一个像这样的table:
CREATE TABLE events(
device_id UInt64,
dt DateTime,
temp Float32
) Engine = MergeTree Order By (device_id, dt);
并且在您的应用程序中,您使用此查询:
SELECT
device_id,
toDate(dt) as day,
count() as cnt
FROM events
GROUP BY device_id, day
如您所见,您将根据每个 device_id
.
的生成日期获取事件计数
现在,如果您过于频繁地使用此信息,将此查询放在另一个查询中会使它看起来像这样复杂得多:
SELECT *
FROM event_detail ed
INNER JOIN (
SELECT
device_id,
toDate(dt) as day,
count() as cnt
FROM events
GROUP BY device_id, day
) daily_event_counts
ON ed.device_id = daily_event_counts.device_id
因此您为子查询创建了一个视图,如下所示:
CREATE VIEW daily_event_counts AS
SELECT
device_id,
toDate(dt) as day,
count() as cnt
FROM events
GROUP BY device_id, day;
之后写查询就容易多了:
SELECT *
FROM event_detail ed
INNER JOIN daily_event_counts
ON ed.device_id = daily_event_counts.device_id
如您所见,它只是一个命名查询,仅此而已。
我正在研究 ClickHouse 的 VIEW、MATERIALIZED VIEW 和 LIVE VIEW。
MATERIALIZED VIEW 和 LIVE VIEW 在 official docs 中有很好的描述。
但是,table 描述中的 VIEW 是有限的。 来自官方文档:
As an example, assume you’ve created a view:
CREATE VIEW view AS SELECT ...
and written a query:
SELECT a, b, c FROM view
但它没有指定table 我们正在做的 SELECT 引擎支持哪些 table 引擎。此外,没有使用示例。 您能否提供一个 VIEW 的最小使用示例,并解释初始 table 支持哪些 table 引擎?
关于 VIEW 和 MATERIALIZED VIEW 类型之间的区别,我找到了这个针对 Oracle 的答案,看起来它也可以应用于 ClickHouse What is the difference between Views and Materialized Views in Oracle?。
编辑:在评论中添加了来自 link 测试的一些基本示例:
示例 1
DROP TABLE IF EXISTS union;
create view union as select 1 as test union all select 2;
SELECT * FROM union ORDER BY test;
DETACH TABLE union;
ATTACH TABLE union;
SELECT * FROM union ORDER BY test;
DROP TABLE union;
示例 2:
DROP VIEW IF EXISTS test_view;
DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table
(
f1 Int32,
f2 Int32,
pk Int32
)
ENGINE = MergeTree()
ORDER BY f1
PARTITION BY pk;
CREATE VIEW test_view AS
SELECT f1, f2
FROM test_table
WHERE pk = 2;
INSERT INTO test_table (f1, f2, pk) VALUES (1,1,1), (1,1,2), (2,1,1), (2,1,2);
SELECT * FROM test_view ORDER BY f1, f2;
ALTER TABLE test_view DELETE WHERE pk = 2; --{serverError 48}
SELECT * FROM test_view ORDER BY f1, f2;
DROP VIEW IF EXISTS test_view;
DROP TABLE IF EXISTS test_table;
视图只是一个保存的查询,仅此而已。
由于在查询 table 时没有指定 table 引擎,因此不需要为视图指定引擎。您甚至可以组合多个 table,每个具有不同的 table 引擎。
因此,您不必一直发出长查询,而是可以为该查询创建一个视图,这反过来会添加一个抽象层来帮助您简化查询。
假设你有一个像这样的table:
CREATE TABLE events(
device_id UInt64,
dt DateTime,
temp Float32
) Engine = MergeTree Order By (device_id, dt);
并且在您的应用程序中,您使用此查询:
SELECT
device_id,
toDate(dt) as day,
count() as cnt
FROM events
GROUP BY device_id, day
如您所见,您将根据每个 device_id
.
现在,如果您过于频繁地使用此信息,将此查询放在另一个查询中会使它看起来像这样复杂得多:
SELECT *
FROM event_detail ed
INNER JOIN (
SELECT
device_id,
toDate(dt) as day,
count() as cnt
FROM events
GROUP BY device_id, day
) daily_event_counts
ON ed.device_id = daily_event_counts.device_id
因此您为子查询创建了一个视图,如下所示:
CREATE VIEW daily_event_counts AS
SELECT
device_id,
toDate(dt) as day,
count() as cnt
FROM events
GROUP BY device_id, day;
之后写查询就容易多了:
SELECT *
FROM event_detail ed
INNER JOIN daily_event_counts
ON ed.device_id = daily_event_counts.device_id
如您所见,它只是一个命名查询,仅此而已。