全文概览:
- 什么是物化视图
- 使用场景
- 如何实现这个需求
- 建立一个使用表引擎的表,作为物化视图的目标表
- 确定需要查询的SQL
- 创建物化视图
- 测试
文件引擎其实是一个不常用的特殊表引擎,结合【ClickHouse09-表引擎之文件引擎】一章节的基础介绍
这边有一个需求:
ClickHouse的日志数据存储在表中,不像其他数据库引擎有文件中的日志,能够方便同步和分析,那现在就想仿照其他数据库,将ClickHouse的查询日志表中数据部分过滤同步到文件中,便于其他日志组件将数据汇聚一起分析
流程:
table: query_log —> filter comment with sql —> create MATERIALIZED view —> save into files
这边还需要引入一个概念:物化视图
什么是物化视图
物化视图(Materialized View)是一种特殊类型的表
- 它能够根据定义在其上的SQL查询结果自动更新数据
- 它并不存储查询表达式本身,而是实际计算和存储了该查询的结果集
- 当源表有新的数据插入、修改或满足特定条件时,物化视图会实时或者按照配置的策略执行预定义的聚合或其他计算,并将结果写入到物化视图对应的表中
使用场景
- 通过Select请求聚合并查询数据
- 在写入时将数据准备为新格式
- 在写入到特定聚合时准备数据
比较常见的使用:按月、按年分表同步,针对原始表按照指标定期做数据聚合产生中间统计表等
如何实现这个需求
建立一个使用表引擎的表,作为物化视图的目标表
CREATE TABLE default.query_log_file
(`event_time` DateTime,`user` LowCardinality(String),`query_id` String,`read_rows` UInt64,`read_bytes` UInt64,`result_rows` UInt64,`result_bytes` UInt64,`memory_usage` UInt64,`exception` String
)
ENGINE = File(TabSeparated);
确定需要查询的SQL
SELECT event_time, user, query_id AS query, read_rows, read_bytes, result_rows, result_bytes, memory_usage, exception
FROM clusterAllReplicas('cluster_name', system, query_log)
WHERE (event_date = yesterday()) AND query_duration_ms > 30000 AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%')
ORDER BY query_duration_ms desc
LIMIT 100
创建物化视图
CREATE MATERIALIZED VIEW query_log_file_view TO default.query_log_file AS
SELECT event_time, user, query_id, read_rows, read_bytes, result_rows, result_bytes, memory_usage, exception
FROM system.query_log
WHERE query_duration_ms > 3 AND (is_initial_query = 1) AND (query NOT LIKE 'INSERT INTO%')
测试
产生测试数据:执行一些查询、alter语句,最好是慢查询,查看是否被视图捕获,查看是否写入文件
如果写入文件,那么后续的采集就基于文件来处理即可,按周写入的format来解析
以上就是使用日志的功能,将物化视图和文件表引擎结合,做了一个样例,实际使用中物化视图还可以结合更多的表引擎发挥更大的价值
如果喜欢我的文章的话,可以去GitHub上给一个免费的关注吗?