01
概念介绍
SQL 文本 视图定义 表和分区的版本 用户变量和结果值 非确定函数和结果值 行策略定义 数据脱敏定义
这或许是一个对你有用的开源项目,data-warehouse-learning 项目是一套基于 MySQL + Kafka + Hadoop + Hive + Dolphinscheduler + Doris + Seatunnel + Paimon + Hudi + Iceberg + Flink + Dinky + DataRT + SuperSet 实现的实时离线数仓(数据湖)系统,以大家最熟悉的电商业务为切入点,详细讲述并实现了数据产生、同步、数据建模、数仓(数据湖)建设、数据服务、BI报表展示等数据全链路处理流程。
https://gitee.com/wzylzjtn/data-warehouse-learning
https://github.com/Mrkuhuo/data-warehouse-learning
https://bigdatacircle.top/
项目演示:
02
实现原理
若目标 BE 中存有该查询结果的缓存,FE 便能迅速将结果返回给客户端 反之,若 BE 中未找到对应的结果缓存,FE 则需执行完整的 SQL 解析与优化流程,随后将查询计划传送至 BE 进行计算处理。
03
最佳实践
3.1 开启和关闭 SQL Cache
-- 在当前 Session 打开 SQL Cache, 默认是关闭状态
set enable_sql_cache=true;
-- 在当前 Session 关闭 SQL Cache
set enable_sql_cache=false;
-- 全局打开 SQL Cache, 默认是关闭状态
set global enable_sql_cache=true;
-- 全局关闭 SQL Cache
set global enable_sql_cache=false;
3.2 检查查询是否命中 SQL Cache
> explain plan select * from t2;
+------------------------------------------------------------------------------------------------------------+
| Explain String(Nereids Planner) |
+------------------------------------------------------------------------------------------------------------+
| ========== PARSED PLAN (time: 28ms) ========== |
| LogicalSqlCache[1] ( queryId=711dea740e4746e6-8bc11afe08f6542c ) |
| +--PhysicalResultSink[39] ( outputExprs=[id#0, name#1] ) |
| +--PhysicalOlapScan[t2]@0 ( stats=12 ) |
| |
| ========== ANALYZED PLAN ========== |
| LogicalSqlCache[1] ( queryId=711dea740e4746e6-8bc11afe08f6542c ) |
| +--PhysicalResultSink[39] ( outputExprs=[id#0, name#1] ) |
| +--PhysicalOlapScan[t2]@0 ( stats=12 ) |
| |
| ========== REWRITTEN PLAN ========== |
| LogicalSqlCache[1] ( queryId=711dea740e4746e6-8bc11afe08f6542c ) |
| +--PhysicalResultSink[39] ( outputExprs=[id#0, name#1] ) |
| +--PhysicalOlapScan[t2]@0 ( stats=12 ) |
| |
| ========== OPTIMIZED PLAN ========== |
| PhysicalSqlCache[3] ( queryId=711dea740e4746e6-8bc11afe08f6542c, backend=192.168.126.3:9051, rowCount=12 ) |
| +--PhysicalResultSink[39] ( outputExprs=[id#0, name#1] ) |
| +--PhysicalOlapScan[t2]@0 ( stats=12 ) |
+------------------------------------------------------------------------------------------------------------+
对于 Doris 2.1.3 之前的版本,用户则需要通过查看 Profile 信息来确认查询是否命中了 SQL Cache。在 Profile 信息中,若 Is Cached: 这一字段显示为 Yes,则代表该查询已成功命中 SQL Cache。
Execution Summary:
- Parse SQL Time: 18ms
- Nereids Analysis Time: N/A
- Nereids Rewrite Time: N/A
- Nereids Optimize Time: N/A
- Nereids Translate Time: N/A
- Workload Group: normal
- Analysis Time: N/A
- Wait and Fetch Result Time: N/A
- Fetch Result Time: 0ms
- Write Result Time: 0ms
- Doris Version: 915138e801
- Is Nereids: Yes
- Is Cached: Yes
- Total Instances Num: 0
- Instances Num Per BE:
- Parallel Fragment Exec Instance Num: 1
- Trace ID:
- Transaction Commit Time: N/A
- Nereids Distribute Time: N/A
这两种方法均为用户提供了有效的手段来验证查询是否利用了 SQL Cache,从而帮助用户更好地评估查询性能并优化查询策略。
# 代表已经把 1 个 SQL 写入到缓存中
doris_fe_cache_added{type="sql"} 1
# 代表命中了两次 SQL Cache
doris_fe_cache_hit{type="sql"} 2
2. 在 BE 的 HTTP 接口 http://${BE_IP}:${BE_HTTP_PORT}/metrics 会返回相关信息:
# 代表当前 BE 的内存中存在 1205 个 Cache
doris_be_query_cache_sql_total_count 1205
# 当前所有 Cache 占用 BE 内存 44k
doris_be_query_cache_memory_total_byte 44101
-- 最多存放 100 个 Cache 元数据,超过时自动释放最近最久未使用的元数据。默认值为 100。
ADMIN SET FRONTEND CONFIG ('sql_cache_manage_num'='100');
-- 当 300 秒未访问该 Cache 元数据后,自动进行释放。默认值为 300。
ADMIN SET FRONTEND CONFIG ('expire_sql_cache_in_fe_second'='300');
-- 当 Cache 的内存空间超过 query_cache_max_size_mb + query_cache_elasticity_size_mb 时,
-- 释放最近最久未使用的 Cache,直至占用内存低于 query_cache_max_size_mb。
query_cache_max_size_mb = 256
query_cache_elasticity_size_mb = 128
-- 默认超过 3000 行结果时,不创建 SQL Cache。
ADMIN SET FRONTEND CONFIG ('cache_result_max_row_count'='3000');
-- 默认超过 30M 时,不创建 SQL Cache。
ADMIN SET FRONTEND CONFIG ('cache_result_max_data_size'='31457280');
缓存失效原因一般包括以下几点: 表/视图的结构发生了变化,例如执行了 drop table、replace table、alter table 或 alter view 等操作。 表数据发生了变化,例如执行了 insert、delete、update 或 truncate 等操作。 用户权限被移除,例如执行了 revoke 操作。 使用了非确定函数,并且函数的评估值发生了变化,例如执行了 select random()。 使用了变量,并且变量的值发生了变化,例如执行了 select * from tbl where dt = @dt_var。 Row Policy 或 Data Masking 发生了变化,例如设置了用户对某些表的部分数据不可见。 结果行数超过了 FE 配置的 cache_result_max_row_count,默认值为 3000 行。 结果大小超过了 FE 配置的 cache_result_max_data_size,默认值为 30MB。
04
使用限制
05
进交流群群添加作者
推荐阅读系列文章
建议收藏 | Dinky系列总结篇 建议收藏 | Flink系列总结篇 建议收藏 | Flink CDC 系列总结篇 建议收藏 | Doris实战文章汇总
如果喜欢 请点个在看分享给身边的朋友