diff --git a/TOC.md b/TOC.md index cf978079de3e..f6360587c3cb 100644 --- a/TOC.md +++ b/TOC.md @@ -914,6 +914,7 @@ - [使用 TiSpark 读取 TiFlash](/tiflash/use-tispark-to-read-tiflash.md) - [使用 MPP 模式](/tiflash/use-tiflash-mpp-mode.md) - [TiFlash 支持的计算下推](/tiflash/tiflash-supported-pushdown-calculations.md) + - [TiFlash 查询结果物化](/tiflash/tiflash-results-materialization.md) - [TiFlash 数据校验](/tiflash/tiflash-data-validation.md) - [TiFlash 兼容性说明](/tiflash/tiflash-compatibility.md) - [遥测](/telemetry.md) diff --git a/experimental-features.md b/experimental-features.md index 895667a4046c..fe86b23c90f4 100644 --- a/experimental-features.md +++ b/experimental-features.md @@ -37,6 +37,7 @@ aliases: ['/docs-cn/dev/experimental-features-4.0/','/zh/tidb/dev/experimental-f + [表级锁 (Table Lock)](/tidb-configuration-file.md#enable-table-lock-从-v400-版本开始引入)(v4.0.0 实验特性) + [Range INTERVAL 分区](/partitioned-table.md#range-interval-分区)(v6.3.0 实验特性) + [将集群的数据恢复到特定的时间点 `FLASHBACK CLUSTER TO TIMESTAMP`](/sql-statements/sql-statement-flashback-to-timestamp.md)。(v6.4.0 实验特性) ++ [TiFlash 查询结果物化](/tiflash/tiflash-results-materialization.md)(v6.5.0 实验特性) ## 存储 diff --git a/system-variables.md b/system-variables.md index 4ad6fafe8cb8..ab4d0fc8cc4e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1556,12 +1556,15 @@ Query OK, 0 rows affected (0.09 sec) > **警告:** > -> 当前版本中该变量控制的功能尚未完全生效,请保留默认值。 +> 当前版本中该变量控制的功能是实验性功能,暂不建议在生产环境中使用。 - 作用域:SESSION | GLOBAL - 是否持久化到集群:是 - 默认值:`OFF` -- 这个变量用于控制写 SQL 中的读取是否会下推到 TiFlash。 +- 这个变量用于控制包含增删改的 SQL 语句中的读取操作能否下推到 TiFlash,比如: + + - `INSERT INTO SELECT` 语句中的 `SELECT` 查询(典型应用场景为 [TiFlash 查询结果物化](/tiflash/tiflash-results-materialization.md)) + - `UPDATE` 和 `DELETE` 语句中的 `WHERE` 条件过滤 ### `tidb_enable_tmp_storage_on_oom` @@ -1581,7 +1584,7 @@ Query OK, 0 rows affected (0.09 sec) - 作用域:GLOBAL - 是否持久化到集群:是 - 默认值:`OFF` -- 这个变量用控制是否开启 [Top SQL 特性](/dashboard/top-sql.md)。 +- 这个变量用于控制是否开启 [Top SQL 特性](/dashboard/top-sql.md)。 ### `tidb_enable_tso_follower_proxy` 从 v5.3.0 版本开始引入 diff --git a/tiflash/tiflash-results-materialization.md b/tiflash/tiflash-results-materialization.md new file mode 100644 index 000000000000..a23f3730bbd5 --- /dev/null +++ b/tiflash/tiflash-results-materialization.md @@ -0,0 +1,69 @@ +--- +title: TiFlash 查询结果物化 +summary: 介绍如何在同一个事务中保存 TiFlash 的查询结果。 +--- + +# TiFlash 查询结果物化 + +> **警告:** +> +> 该功能目前是实验性功能,请注意使用场景限制。该功能会在未事先通知的情况下发生变化或删除。语法和实现可能会在 GA 前发生变化。如果发现 bug,请在 GitHub 上提交 [issue](https://github.com/pingcap/tidb/issues) 反馈。 + +本文介绍如何在同一个事务 (`INSERT INTO SELECT`) 中实现将 TiFlash 查询结果保存至某一指定的 TiDB 表中。 + +从 v6.5.0 起,TiDB 支持将 TiFlash 查询结果保存到数据表中,即物化了 TiFlash 的查询结果。执行 `INSERT INTO SELECT` 语句时,如果 TiDB 将 `SELECT` 子查询下推到了 TiFlash,TiFlash 的查询结果可以保存到 `INSERT INTO` 指定的 TiDB 表中。v6.5.0 之前的 TiDB 版本不允许此类行为,即通过 TiFlash 执行的查询必须是只读的,你需要从应用程序层面接收 TiFlash 返回的结果,然后另行在其它事务或处理中保存结果。 + +> **注意:** +> +> - 默认情况下 ([`tidb_allow_mpp = ON`](/system-variables.md#tidb_allow_mpp-从-v50-版本开始引入)),TiDB 优化器将依据查询代价智能选择下推查询到 TiKV 或 TiFlash。如需强制使用 TiFlash 查询,你可以设置系统变量 [`tidb_enforce_mpp`](/system-variables.md#tidb_enforce_mpp-从-v51-版本开始引入) 为 `ON`。 +> - 在实验特性阶段,该功能默认关闭。要开启此功能,请设置系统变量 [`tidb_enable_tiflash_read_for_write_stmt`](/system-variables.md#tidb_enable_tiflash_read_for_write_stmt-从-v630-版本开始引入) 为 `ON`。 + +`INSERT INTO SELECT` 语法如下: + +```sql +INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] + [INTO] tbl_name + [PARTITION (partition_name [, partition_name] ...)] + [(col_name [, col_name] ...)] + SELECT ... + [ON DUPLICATE KEY UPDATE assignment_list]value: + {expr | DEFAULT} + +assignment: + col_name = valueassignment_list: + assignment [, assignment] ... +``` + +例如,通过以下 `INSERT INTO SELECT` 语句,你可以将 `SELECT` 子句中表 `t1` 的查询结果保存到表 `t2` 中: + +```sql +INSERT INTO t2 (name, country) +SELECT app_name, country FROM t1; +``` + +## 典型和推荐的使用场景 + +- 高效的 BI 解决方案 + + 很多报表类应用有较重的分析查询,如果有很多用户同时打开和刷新报表,则会产生较多的查询请求。一个有效的解决方案是使用本功能在 TiDB 表中保存报表查询的结果,报表刷新时再从结果表中抽取数据,则可以避免多次重复的分析计算。同理,在保存历史分析记录的基础上,可以进一步优化长时间历史数据分析的计算量。例如,某报表 A 用于分析每日的销售利润,使用本功能你可以将报表 A 中每日的分析结果保存到某结果表 T 中。那么,在生成报表 B 分析过去一个月的销售利润时,可以直接使用表 T 中的每日分析结果数据,不仅大幅降低计算量也提升了查询响应速度,减轻系统负载。 + +- 使用 TiFlash 服务在线应用 + + TiFlash 支持的并发请求数量视数据量和查询复杂度不同,但一般不会超过 100 QPS。你可以使用本功能保存 TiFlash 的查询结果,然后通过查询结果表来支持在线的高并发请求。后台的结果表数据更新可以以较低的频率进行,例如以 0.5 秒间隔更新结果表数据也远低于 TiFlash 的并发上限,同时仍然较好地保证了数据新鲜度。 + +## 执行过程 + +* 在 `INSERT INTO SELECT` 语句的执行过程中,TiFlash 首先将 `SELECT` 子句的查询结果返回到集群中某单一 TiDB server 节点,然后再写入目标表(可以有 TiFlash 副本)。 +* `INSERT INTO SELECT` 语句的执行保证 ACID 特性。 + +## 限制 + +* TiDB 对 `INSERT INTO SELECT` 语句的内存限制可以通过系统变量 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 调整。从 v6.5.0 版本开始,不推荐使用 [`txn-total-size-limit`](/tidb-configuration-file.md#txn-total-size-limit) 来控制事务内存大小,详见该配置项文档。 + + 更多信息,请参考 [TiDB 内存控制](/configure-memory-usage.md)。 + +* TiDB 对 `INSERT INTO SELECT` 语句的并发没有硬性限制,但是推荐考虑以下用法: + + * 当“写事务”较大时,例如接近 1 GiB,建议控制并发不超过 10。 + * 当“写事务”较小时,例如小于 100 MiB,建议控制并发不超过 30。 + * 请基于测试和具体情况做出合理选择。 \ No newline at end of file