Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TiFlash results materialization #11701

Merged
merged 39 commits into from
Dec 8, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
a84669b
tiflash results materialization
moyun Oct 19, 2022
b2e0826
add line breaks
moyun Oct 19, 2022
d8e0d7e
update contents
moyun Oct 21, 2022
9ee8b4a
fix line breaks
moyun Oct 21, 2022
d75a9cb
reformat
moyun Oct 21, 2022
5e4f91d
updated the doc according the communication with @moyun
qiancai Oct 27, 2022
edaff5f
Apply suggestions from code review
qiancai Nov 1, 2022
1288f6b
Apply suggestions from code review
qiancai Nov 2, 2022
7b943b8
Update tiflash/tiflash-results-materialization.md
moyun Nov 28, 2022
b95e98f
update txn size limitation
moyun Nov 28, 2022
875add1
update usage
moyun Dec 1, 2022
eda8477
update usage
moyun Dec 1, 2022
ce73311
Apply suggestions from code review
qiancai Dec 1, 2022
4997bc9
format updates
qiancai Dec 1, 2022
e3e9ef7
Update experimental-features.md
qiancai Dec 2, 2022
1a09986
Apply suggestions from code review
qiancai Dec 2, 2022
0940fe1
format updates
qiancai Dec 2, 2022
8837d69
Apply suggestions from code review
qiancai Dec 5, 2022
687088b
Apply suggestions from code review
qiancai Dec 6, 2022
d40358d
format changes
qiancai Dec 6, 2022
eb09f9e
Update system-variables.md
qiancai Dec 6, 2022
fa5b920
Update tiflash-results-materialization.md
qiancai Dec 6, 2022
03ba52c
unify wording
qiancai Dec 6, 2022
c17513f
Update system-variables.md
qiancai Dec 6, 2022
4ba4ab2
Apply suggestions from code review
qiancai Dec 6, 2022
37a0d13
fix link errors
qiancai Dec 6, 2022
41cfda7
fix link errors
qiancai Dec 6, 2022
428e03e
Update tiflash/tiflash-results-materialization.md
qiancai Dec 6, 2022
711eeeb
Merge remote-tracking branch 'upstream/master' into pr/11701
qiancai Dec 6, 2022
4e666b4
Update experimental-features.md
qiancai Dec 6, 2022
c12653d
fix CI errors
qiancai Dec 6, 2022
97bf1bf
Apply suggestions from code review
moyun Dec 6, 2022
fee7186
Update system-variables.md
moyun Dec 6, 2022
98251ff
Apply suggestions from code review
qiancai Dec 7, 2022
47ba9bb
fix link errors
qiancai Dec 7, 2022
17db431
fix CI errors
qiancai Dec 7, 2022
f94a094
Update system-variables.md
qiancai Dec 7, 2022
95ac800
format updates
qiancai Dec 8, 2022
c90460f
Update system-variables.md
qiancai Dec 8, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions TOC.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions experimental-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 实验特性)

## 存储

Expand Down
9 changes: 6 additions & 3 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`

Expand All @@ -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` <span class="version-mark">从 v5.3.0 版本开始引入</span>

Expand Down
69 changes: 69 additions & 0 deletions tiflash/tiflash-results-materialization.md
Original file line number Diff line number Diff line change
@@ -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。
* 请基于测试和具体情况做出合理选择。