在 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

如您所见,它只是一个命名查询,仅此而已。