From 54fb7a45046b08dc709efa458f4a14bfeff0d609 Mon Sep 17 00:00:00 2001 From: ekexium Date: Wed, 6 Nov 2024 22:11:58 +0800 Subject: [PATCH 01/19] doc: batch processing overview and pipelined dml Signed-off-by: ekexium --- TOC.md | 2 + batch-processing.md | 82 ++++++++++++++++++++++++ pipelined-dml.md | 152 ++++++++++++++++++++++++++++++++++++++++++++ system-variables.md | 12 +--- 4 files changed, 237 insertions(+), 11 deletions(-) create mode 100644 batch-processing.md create mode 100644 pipelined-dml.md diff --git a/TOC.md b/TOC.md index ae7a5a31e72c..8b280fb7cdff 100644 --- a/TOC.md +++ b/TOC.md @@ -349,6 +349,7 @@ - [Load Base Split 使用文档](/configure-load-base-split.md) - [Store Limit 使用文档](/configure-store-limit.md) - [DDL 执行原理及最佳实践](/ddl-introduction.md) + - [批量处理概览](/batch-processing.md) - PD 微服务使用文档 - [PD 微服务概览](/pd-microservices.md) - [使用 TiUP 扩容缩容 PD 微服务节点](/scale-microservices-using-tiup.md) @@ -939,6 +940,7 @@ - [乐观事务](/optimistic-transaction.md) - [悲观事务](/pessimistic-transaction.md) - [非事务 DML 语句](/non-transactional-dml.md) + - [Pipelined DML](/pipelined-dml.md) - [视图](/views.md) - [分区表](/partitioned-table.md) - [临时表](/temporary-tables.md) diff --git a/batch-processing.md b/batch-processing.md new file mode 100644 index 000000000000..d92512e80290 --- /dev/null +++ b/batch-processing.md @@ -0,0 +1,82 @@ +--- +title: 批量处理概览 +summary: 介绍了 TiDB 为批量处理场景提供的功能,包括 Pipelined DML、非事务性 DML、IMPORT INTO 语句、被废弃的 batch dml 等 +--- + +# 批量处理概览 + +批量处理场景对 TiDB 的主要挑战在于 TiDB 内存限制了事务的大小,以及对更快的处理速度的要求。 + +随着版本演进,TiDB 提供了多种批量数据处理功能,但它们之间的区别和适用场景容易混淆。本文将详细对比: +- Pipelined DML +- 非事务性 DML +- IMPORT INTO 语句 +- 已废弃 batch dml + +通过明确每个功能的特点,帮助在批量处理场景下做出正确选择。 + +## Pipelined DML + +Pipelined DML 在 TiDB v8.1 LTS 作为实验性特性发布,在 v8.5 LTS 内核部分功能得到完善,性能大幅提升。 + +它的主要特点是: +1. 适合通用的批量数据处理场景,支持 INSERT、REPLACE、UPDATE、DELETE 操作。 +2. 事务大小不再受到 TiDB 内存限制,支持处理超大规模数据。 +3. 速度比标准 DML 更快。 +4. 通过系统变量启用,无需修改 SQL 语句。 + +它的主要限制是: +1. 只适用于自动提交的语句。 + +它的适用场景是:通用的批量数据处理场景,例如大量数据的插入、更新、删除等。 + +更多信息见[Pipelined DML](/pipelined-dml.md)。 + +## 非事务 DML 语句 + +非事务 DML 语句是在 TiDB v6.1 LTS 首次引入的功能,支持 DELETE。在 v6.5 中开始支持 INSERT、REPLACE、UPDATE。 + +它的主要特点是: +- 通过将一条语句拆为多条语句执行,使得每个语句的事务更小,绕开内存限制。 +- 处理速度比标准 DML 稍快或相当。 + +它的主要限制是: +- 只适用于自动提交的语句。 +- 需要修改 SQL 语句。 +- 对 SQL 语句本身限制较多,不符合条件的语句可能需要改写。 +- 因为拆分执行,不具有完整的事务 ACID 性质,在失败时语句可能部分完成。 + +它的适用场景是:大量数据的插入、更新、删除等场景。由于限制较多,建议在 Pipelined DML 不适用的场景下考虑使用。 + +更多信息见[非事务 DML 语句](/non-transactional-dml.md)。 + +## IMPORT INTO 语句 + +IMPORT INTO 语句是在 TiDB v7.5 LTS 首次引入的功能,专为数据导入设计,以替代 TiDB Lightning。 + +它的主要特点是: +- 导入速度非常快。 +- 易用性比 TiDB Lightning 更高。 + +它的主要限制是: +- 只适合数据导入场景。 +- 不满足事务 ACID 性质。 +- 使用限制较多。 + +它的适用场景是:数据导入场景,例如数据迁移、数据恢复等。建议在合适的场景下,使用 IMPORT INTO 代替 TiDB Lightning。 + +更多信息见[IMPORT INTO](/sql-statements/sql-statement-import-into.md)。 + +## 已被废弃的 batch dml + +在 TiDB v4.0 以前用于批量处理的 batch dml 功能已被废弃,不再推荐使用。这个功能是由以下这组系统变量控制的: + +- `tidb_batch_insert` +- `tidb_batch_delete` +- `tidb_batch_commit` +- `tidb_enable_batch_dml` +- `tidb_dml_batch_size` + +这组功能因为容易引起数据索引不一致,导致数据损坏或丢失,已被废弃。相关变量将被逐渐移除。 + +不建议在任何场景下使用已被废弃的 batch dml 功能。建议迁移到上面描述的其它方案。 \ No newline at end of file diff --git a/pipelined-dml.md b/pipelined-dml.md new file mode 100644 index 000000000000..40b71552ea40 --- /dev/null +++ b/pipelined-dml.md @@ -0,0 +1,152 @@ +--- +title: Pipelined DML +summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小不再受到 TiDB 内存限制。batch processing, bulk, non-transactional DML +--- + +# Pipelined DML + +> **警告:** +> +> 该功能目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。语法和实现可能会在 GA 前发生变化。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 + +本文档介绍 Pipelined DML 的使用场景、使用方法、使用限制和使用该功能的常见问题。 + +Pipelined DML 是 TiDB 的一项实验特性,用于优化大规模数据写入场景。通过持续将事务数据写入存储层而不是完全缓存在内存中,该特性可以显著降低内存占用,提升大规模数据写入性能。使用 Pipelined DML,你可以执行超大规模的 DML 操作而不必担心内存溢出问题。 + +## 使用场景和作用 + +Pipelined DML 在以下场景中具有明显优势: + +- 需要执行大规模数据迁移或归档操作 +- 进行批量数据导入或更新 +- ETL (Extract, Transform, Load) 处理涉及大量数据写入 +- 需要降低大规模写入时的内存占用 + +Pipelined DML 在这些场景主要有 3 点优势 +- 事务使用内存可控,事务大小不受 TiDB 内存总量限制。事务部分内存使用限制在 1 GiB 以内。 +- 延迟更低。 +- CPU 和 IO 负载更平滑。 + +### 数据归档场景 + +当需要将历史数据从活跃表归档到归档表时,通常涉及大量数据迁移。例如: + +```sql +INSERT INTO sales_archive SELECT * FROM sales WHERE sale_date < '2023-01-01'; +``` + +使用 Pipelined DML 可以有效处理数百万行数据的迁移,避免 OOM 问题。 + +### 批量数据更新场景 + +当需要对大量数据进行更新操作时,例如批量调整商品价格或更新用户状态,Pipelined DML 可以高效完成操作: + +```sql +UPDATE /*+ SET_VAR(tidb_dml_type='bulk') */ products +SET price = price * 1.1 +WHERE category = 'electronics'; +``` + +### 批量删除场景 + +当需要删除大量数据时,例如删除历史数据或清理过期数据,Pipelined DML 可以高效完成操作: + +```sql +DELETE /*+ SET_VAR(tidb_dml_type='bulk') */ FROM logs WHERE log_time < '2023-01-01'; +``` + +## 使用方法 + +### 启用 Pipelined DML + +要使用 Pipelined DML,你需要将 `tidb_dml_type` 会话变量设置为 `"bulk"`: + +```sql +SET tidb_dml_type = "bulk"; +``` + +或者使用 SET_VAR hint,如: + +```sql +INSERT /*+ SET_VAR(tidb_dml_type='bulk') */ INTO target_table SELECT * FROM source_table; +``` + +### 验证是否生效 + +执行语句后,可以通过检查 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入) 变量来确认是否使用了 Pipelined DML: + +```sql +SELECT @@tidb_last_txn_info; +``` + +如果返回结果中 `pipelined` 字段为 `true`,则表示成功使用了 Pipelined DML。 + +## 使用条件 + +1. 操作包含涉及 TiCDC、TiFlash 或 BR 的表时不可以使用。 +> **警告:** +> +> 目前 Pipelined DML 尚不兼容,强行使用可能会引发阻塞和相关组件 OOM 等问题。未来版本会逐渐支持。 + +2. Pipelined DML 不适合在有写写冲突的场景使用。在这种场景下,Pipelined DML 性能可能大幅下降,或失败回滚。 +3. 需要确保在语句执行过程中保持[元数据锁](/metadata-lock.md)处于开启状态。 +4. 使用 Pipelined DML 时,TiDB 会检测以下条件是否符合,不符合时 TiDB 会拒绝使用 Pipelined DML 执行,并自动回退到普通 DML 执行,同时生成对应的 Warning 信息: + - 仅适用于自动提交的语句 + - 仅适用于 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句 + - 不可用于[临时表](/temporary-tables.md)和[缓存表](/cached-tables.md) + - 开启外键约束检查时 (`foreign_key_checks = ON`) ,不可包含外键相关表操作 + +特殊行为: + - `INSERT IGNORE ... ON DUPLICATE UPDATE` 语句可能会在更新造成冲突时报出 `Duplicate entry` 的错误。 + +## 最佳实践 + +- 将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 略微调大,以确保执行器等部分的内存使用不会超过限制。建议值为至少 2 GiB。对于 TiDB 内存充足的情况,可以适当调大。 +- 在向新表进行插入的场景,Pipelined DML 易于受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考[TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md#tidb-热点问题处理)。 + +## 相关配置 + +- 系统变量 [`tidb_dml_type`](/system-variables.md#tidb_dml_type-从-v800-版本开始引入):用于控制是否启用 Pipelined DML。 +- 配置项[`pessimistic-auto-commit`](/tidb-configuration-file.md#pessimistic-auto-commit):当使用 Pipelined DML 时,该配置项的效果等同于设置为 `false`。 +- 以 Pipelined DML 方式执行超大事务时,事务耗时可能较长。对于这种模式的事务,其事务锁的最大 TTL 为 [`max-txn-ttl`](/tidb-configuration-file.md#max-txn-ttl) 与 24 小时中的较大值。 +- 当事务执行时间超过 [`tidb_gc_max_wait_time`](/system-variables.md#tidb_gc_max_wait_time-从-v610-版本开始引入) 设定值后,GC 可能会强制回滚事务,导致事务失败。 +- 以 `"bulk"` 方式执行事务时,事务的大小不受 TiDB 配置项 [`txn-total-size-limit`](/tidb-configuration-file.md#txn-total-size-limit) 的限制。 + +## 观测 Pipelined DML + +Pipelined DML 的执行过程可以通过以下方式进行观测: +- 系统变量[`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入),它可以查看上一个事务的执行信息,包括是否使用了 Pipelined DML。 +- TiDB 日志中包含 "[pipelined dml]" 字样的日志行表示展示了 Pipelined DML 的执行过程和进度,包括当前阶段、已经写入的数据量等。 +- TiDB 日志中的 ["expensive query" 日志](/identify-expensive-queries.md#expensive-query-日志示例) 包含的 affected rows 字段,可以查看耗时较长语句的当前进度。 +- [`INFORMATION_SCHEMA.PROCESSLIST`](/information-schema/information-schema-processlist.md)表,会展示事务的执行进度。Pipelined DML 通常用于大事务,执行耗时较长,可以通过该表查看事务的执行进度。 + +## 常见问题 + +### 为什么我的查询没有使用 Pipelined DML? + +当 TiDB 拒绝以 Pipelined DML 模式执行语句时,会生成对应的 warning,可以通过检查 warning 信息得知原因。 + +常见的原因: + +1. 语句不是自动提交的 +2. 使用了不支持的表类型 +3. 涉及外键且外键检查开启 + +### Pipelined DML 会影响事务的隔离级别吗? + +不会。Pipelined DML 仅改变了事务写入的实现机制,不影响 TiDB 的事务隔离保证。 + +### 为什么使用了 Pipelined DML 还是会内存不足? + +即时开启了 Pipelined DML,仍然有可能碰到内存 quota 不足导致语句被 kill 的情况: +``` +The query has been canceled due to exceeding the memory limit allowed for a single SQL query. Please try to narrow the query scope or increase the tidb_mem_quota_query limit, and then try again. +``` + +这是因为 Pipelined DML 功能仅控制了事务部分使用的内存,但语句使用的总内存还需要包括执行器等部分的内存。如果语句需要的总内存空间超过了 TiDB 的内存限制,仍然会出现内存不足的情况。 +通常将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 设置为更大的值可以解决这个问题。推荐设置为 2 GiB。对于算子复杂或数据量大的 SQL,可能需要更大的值。 + +## 探索更多 + +- [批量处理概览](/batch-processing.md) +- [TiDB 内存控制](/configure-memory-usage.md) \ No newline at end of file diff --git a/system-variables.md b/system-variables.md index 7b49df1cb93f..4c34f1e9d739 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1628,17 +1628,7 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 该变量用来设置 DML 语句的执行方式。 - `"standard"` 表示使用标准的 DML 执行方式,TiDB 事务在提交前缓存在内存中。适用于处理高并发且可能存在冲突的事务场景,为默认推荐使用的执行方式。 - `"bulk"` 表示使用批量 DML 执行方式,适合于处理因大量数据写入导致 TiDB 内存使用过多的情况。 - - 在 TiDB 事务执行过程中,数据不是完全缓存在 TiDB 内存中,而是持续写入 TiKV,以减少内存的占用,同时平滑写入压力。 - - 只有 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句受 `"bulk"` 方式的影响。由于 `"bulk"` 模式流水线执行的方式,其中 `INSERT IGNORE ... ON DUPLICATE UPDATE ...` 的用法可能会在更新造成冲突时报出 `Duplicate entry` 的错误;而在 `"standard"` 模式下,由于设置了 `IGNORE` 关键字,该错误会被忽略,不会返回给用户。 - - `"bulk"` 方式仅适用于大批量**无冲突数据写入**的场景,不能高效处理写入冲突的场景,写写冲突可能会导致大批量事务提交失败并被回滚。 - - `"bulk"` 方式只对自动提交 (auto-commit) 的语句生效。当设置为 `"bulk"` 时,[`pessimistic-auto-commit`](/tidb-configuration-file.md#pessimistic-auto-commit) 配置项的效果等同于设置为 `false`。 - - 使用 `"bulk"` 方式执行语句时,需要确保在语句执行过程中保持[元数据锁](/metadata-lock.md)处于开启状态。 - - `"bulk"` 方式不可以在[临时表](/temporary-tables.md)、[缓存表](/cached-tables.md)上使用。 - - `"bulk"` 方式不可以在开启外键约束检查时 (`foreign_key_checks = ON`) 对包含外键的表和被外键引用的表使用。 - - 当遇到不支持或不兼容的情况时,`"bulk"` 方式会回退到 `"standard"` 方式执行,并返回一条警告信息。你可以通过 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入) 查看 `pipelined` 字段,如果为 `true` 则表示是使用 `"bulk"` 方式执行。 - - 以 `"bulk"` 方式执行超大事务时,事务耗时可能较长。对于这种模式的事务,其事务锁的最大 TTL 为 [`max-txn-ttl`](/tidb-configuration-file.md#max-txn-ttl) 与 24 小时中的较大值。此外,当事务执行时间超过 [`tidb_gc_max_wait_time`](#tidb_gc_max_wait_time-从-v610-版本开始引入) 设定值后,GC 可能会强制回滚事务,导致事务失败。 - - 以 `"bulk"` 方式执行事务时,事务的大小不受 TiDB 配置项 [`txn-total-size-limit`](/tidb-configuration-file.md#txn-total-size-limit) 的限制。 - - `"bulk"` 方式由 Pipelined DML 特性实现,详细设计和 GitHub issue 可见 [Pipelined DML](https://github.com/pingcap/tidb/blob/master/docs/design/2024-01-09-pipelined-DML.md) 和 [#50215](https://github.com/pingcap/tidb/issues/50215)。 + - `"bulk"` 方式目前由 Pipelined DML 特性实现,可见 [Pipelined DML](/pipelined-dml.md)。 ### `tidb_enable_1pc` 从 v5.0 版本开始引入 From 412850f40879f8ed97f4b79946cb8614e9152079 Mon Sep 17 00:00:00 2001 From: ekexium Date: Thu, 5 Dec 2024 16:04:04 +0800 Subject: [PATCH 02/19] Update pipelined-dml.md Co-authored-by: you06 --- pipelined-dml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 40b71552ea40..24b102262642 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -97,7 +97,7 @@ SELECT @@tidb_last_txn_info; - 开启外键约束检查时 (`foreign_key_checks = ON`) ,不可包含外键相关表操作 特殊行为: - - `INSERT IGNORE ... ON DUPLICATE UPDATE` 语句可能会在更新造成冲突时报出 `Duplicate entry` 的错误。 + - `INSERT IGNORE ... ON DUPLICATE KEY UPDATE` 语句可能会在更新造成冲突时报出 `Duplicate entry` 的错误。 ## 最佳实践 From c9156ef07ebcba2d56022b04fbaa2cac0013bcc7 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Wed, 11 Dec 2024 18:27:42 +0800 Subject: [PATCH 03/19] Update pipelined-dml.md --- pipelined-dml.md | 108 +++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 24b102262642..a719557e07d4 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -1,6 +1,6 @@ --- title: Pipelined DML -summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小不再受到 TiDB 内存限制。batch processing, bulk, non-transactional DML +summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小不再受到 TiDB 内存限制。 --- # Pipelined DML @@ -9,22 +9,25 @@ summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小 > > 该功能目前为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。语法和实现可能会在 GA 前发生变化。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 -本文档介绍 Pipelined DML 的使用场景、使用方法、使用限制和使用该功能的常见问题。 +本文介绍 Pipelined DML 的使用场景、使用方法、使用限制和使用该功能的常见问题。 -Pipelined DML 是 TiDB 的一项实验特性,用于优化大规模数据写入场景。通过持续将事务数据写入存储层而不是完全缓存在内存中,该特性可以显著降低内存占用,提升大规模数据写入性能。使用 Pipelined DML,你可以执行超大规模的 DML 操作而不必担心内存溢出问题。 +Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大规模数据写入场景的性能。启用 Pipelined DML 后,当执行 DML 操作时,TiDB 会将相应的数据持续写入存储层,而不是全部缓存在内存中。这种方式就像流水线(Pipeline)一样,数据一边被读取(输入),一边被写入到存储层(输出),从而显著降低 DML 操作对内存的占用,提升大规模数据的写入性能。 + +通过 Pipelined DML,你可以执行超大规模的 DML 操作而不必担心内存溢出问题。 ## 使用场景和作用 -Pipelined DML 在以下场景中具有明显优势: +Pipelined DML 适用于以下场景: + +- 大规模数据的迁移或归档操作 +- 批量数据的导入或更新 +- 涉及大量数据写入的 ETL (Extract, Transform, Load) 数据处理 +- 降低大规模数据写入的内存占用 -- 需要执行大规模数据迁移或归档操作 -- 进行批量数据导入或更新 -- ETL (Extract, Transform, Load) 处理涉及大量数据写入 -- 需要降低大规模写入时的内存占用 +在这些场景中,Pipelined DML 具有以下优势: -Pipelined DML 在这些场景主要有 3 点优势 - 事务使用内存可控,事务大小不受 TiDB 内存总量限制。事务部分内存使用限制在 1 GiB 以内。 -- 延迟更低。 +- 延迟更低,事务执行效率更高。 - CPU 和 IO 负载更平滑。 ### 数据归档场景 @@ -42,8 +45,8 @@ INSERT INTO sales_archive SELECT * FROM sales WHERE sale_date < '2023-01-01'; 当需要对大量数据进行更新操作时,例如批量调整商品价格或更新用户状态,Pipelined DML 可以高效完成操作: ```sql -UPDATE /*+ SET_VAR(tidb_dml_type='bulk') */ products -SET price = price * 1.1 +UPDATE /*+ SET_VAR(tidb_dml_type='bulk') */ products +SET price = price * 1.1 WHERE category = 'electronics'; ``` @@ -57,23 +60,27 @@ DELETE /*+ SET_VAR(tidb_dml_type='bulk') */ FROM logs WHERE log_time < '2023-01- ## 使用方法 +本小节介绍如何启用 Pipelined DML 并验证其是否生效。 + ### 启用 Pipelined DML -要使用 Pipelined DML,你需要将 `tidb_dml_type` 会话变量设置为 `"bulk"`: +根据需要,你可以选择以下方式之一启用 Pipelined DML: -```sql -SET tidb_dml_type = "bulk"; -``` +- 如需在会话级别启用 Pipelined DML,请将 [`tidb_dml_type`](system-variables.md#tidb_dml_type-从-v800-版本开始引入) 变量设置为 `"bulk"`: -或者使用 SET_VAR hint,如: + ```sql + SET tidb_dml_type = "bulk"; + ``` -```sql -INSERT /*+ SET_VAR(tidb_dml_type='bulk') */ INTO target_table SELECT * FROM source_table; -``` +- 如需为某一条 DML 语句启用 Pipelined DML,请在该语句中添加 SET_VAR hint,例如: + + ```sql + INSERT /*+ SET_VAR(tidb_dml_type='bulk') */ INTO target_table SELECT * FROM source_table; + ``` ### 验证是否生效 -执行语句后,可以通过检查 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入) 变量来确认是否使用了 Pipelined DML: +执行 DML 语句后,可以查看 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入) 变量来确认该语句的执行是否使用了 Pipelined DML: ```sql SELECT @@tidb_last_txn_info; @@ -81,28 +88,24 @@ SELECT @@tidb_last_txn_info; 如果返回结果中 `pipelined` 字段为 `true`,则表示成功使用了 Pipelined DML。 -## 使用条件 - -1. 操作包含涉及 TiCDC、TiFlash 或 BR 的表时不可以使用。 -> **警告:** -> -> 目前 Pipelined DML 尚不兼容,强行使用可能会引发阻塞和相关组件 OOM 等问题。未来版本会逐渐支持。 +## 使用限制 -2. Pipelined DML 不适合在有写写冲突的场景使用。在这种场景下,Pipelined DML 性能可能大幅下降,或失败回滚。 -3. 需要确保在语句执行过程中保持[元数据锁](/metadata-lock.md)处于开启状态。 -4. 使用 Pipelined DML 时,TiDB 会检测以下条件是否符合,不符合时 TiDB 会拒绝使用 Pipelined DML 执行,并自动回退到普通 DML 执行,同时生成对应的 Warning 信息: - - 仅适用于自动提交的语句 - - 仅适用于 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句 - - 不可用于[临时表](/temporary-tables.md)和[缓存表](/cached-tables.md) - - 开启外键约束检查时 (`foreign_key_checks = ON`) ,不可包含外键相关表操作 +目前,Pipelined DML 存在以下使用限制: -特殊行为: - - `INSERT IGNORE ... ON DUPLICATE KEY UPDATE` 语句可能会在更新造成冲突时报出 `Duplicate entry` 的错误。 +- 与 TiCDC、TiFlash 或 BR 尚不兼容,请勿在与这些组件有关的表上使用 Pipelined DML。强行使用可能会引发阻塞以及这些组件的 OOM 等问题。 +- 不适用于存在写写冲突的场景。在这种场景下,Pipelined DML 性能可能大幅下降,或失败回滚。 +- 在 DML 语句执行过程中,需要确保[元数据锁](/metadata-lock.md)保持开启。 +- 使用 Pipelined DML 时,TiDB 会自动检测以下条件是否全部符合。如果其中任一条件不符合,TiDB 会拒绝使用 Pipelined DML 执行,自动回退到普通 DML 执行,并生成对应的 warning 信息: + - 仅支持自动提交的语句 + - 仅支持 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句。 + - 操作的表不包含[临时表](/temporary-tables.md)或[缓存表](/cached-tables.md)。 + - 当外键约束检查开启 (`foreign_key_checks = ON`)时,操作的表不包含外键关系。 +- 当使用 Pipelined DML 执行 `INSERT IGNORE ... ON DUPLICATE KEY UPDATE` 语句时,如果更新操作发生冲突,可能会返回 `Duplicate entry` 错误。 ## 最佳实践 -- 将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 略微调大,以确保执行器等部分的内存使用不会超过限制。建议值为至少 2 GiB。对于 TiDB 内存充足的情况,可以适当调大。 -- 在向新表进行插入的场景,Pipelined DML 易于受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考[TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md#tidb-热点问题处理)。 +- 将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 略微调大,以确保执行器等部分的内存使用不会超过限制。建议至少设置为 2 GiB。对于 TiDB 内存充足的情况,可以适当调大。 +- 在向新表插入数据的场景,Pipelined DML 易受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考[TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md#tidb-热点问题处理)。 ## 相关配置 @@ -114,37 +117,40 @@ SELECT @@tidb_last_txn_info; ## 观测 Pipelined DML -Pipelined DML 的执行过程可以通过以下方式进行观测: -- 系统变量[`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入),它可以查看上一个事务的执行信息,包括是否使用了 Pipelined DML。 -- TiDB 日志中包含 "[pipelined dml]" 字样的日志行表示展示了 Pipelined DML 的执行过程和进度,包括当前阶段、已经写入的数据量等。 -- TiDB 日志中的 ["expensive query" 日志](/identify-expensive-queries.md#expensive-query-日志示例) 包含的 affected rows 字段,可以查看耗时较长语句的当前进度。 -- [`INFORMATION_SCHEMA.PROCESSLIST`](/information-schema/information-schema-processlist.md)表,会展示事务的执行进度。Pipelined DML 通常用于大事务,执行耗时较长,可以通过该表查看事务的执行进度。 +你可以通过以下方式观测 Pipelined DML 的执行过程: + +- 查看系统变量 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入),获取当前会话上一个事务的执行信息,包括是否使用了 Pipelined DML。 +- 查看 TiDB 日志中包含 `"[pipelined dml]"` 字样的行,了解 Pipelined DML 的执行过程和进度,包括当前阶段、已经写入的数据量等。 +- 查看 TiDB 日志中的 [`expensive query` 日志](/identify-expensive-queries.md#expensive-query-日志示例)的 `affected rows` 字段,获取耗时较长语句的当前进度。 +- 查看 [`INFORMATION_SCHEMA.PROCESSLIST`](/information-schema/information-schema-processlist.md) 表,了解事务的执行进度。Pipelined DML 通常用于大事务,执行耗时较长,可以通过该表查看事务的执行进度。 ## 常见问题 ### 为什么我的查询没有使用 Pipelined DML? -当 TiDB 拒绝以 Pipelined DML 模式执行语句时,会生成对应的 warning,可以通过检查 warning 信息得知原因。 +当 TiDB 拒绝以 Pipelined DML 模式执行语句时,会生成对应的 warning,可以通过检查 warning 信息 (`SHOW WARNINGS;`) 得知原因。 常见的原因: -1. 语句不是自动提交的 -2. 使用了不支持的表类型 -3. 涉及外键且外键检查开启 +- DML 语句不是自动提交的 +- 使用了不支持的表类型,例如[临时表](/temporary-tables.md)或[缓存表](/cached-tables.md) +- 涉及外键且外键检查开启 ### Pipelined DML 会影响事务的隔离级别吗? 不会。Pipelined DML 仅改变了事务写入的实现机制,不影响 TiDB 的事务隔离保证。 -### 为什么使用了 Pipelined DML 还是会内存不足? +### 为什么使用了 Pipelined DML 还是会出现内存不足? + +即使开启了 Pipelined DML,仍然有可能碰到内存 quota 不足导致语句被 kill 的情况: -即时开启了 Pipelined DML,仍然有可能碰到内存 quota 不足导致语句被 kill 的情况: ``` The query has been canceled due to exceeding the memory limit allowed for a single SQL query. Please try to narrow the query scope or increase the tidb_mem_quota_query limit, and then try again. ``` -这是因为 Pipelined DML 功能仅控制了事务部分使用的内存,但语句使用的总内存还需要包括执行器等部分的内存。如果语句需要的总内存空间超过了 TiDB 的内存限制,仍然会出现内存不足的情况。 -通常将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 设置为更大的值可以解决这个问题。推荐设置为 2 GiB。对于算子复杂或数据量大的 SQL,可能需要更大的值。 +这是因为 Pipelined DML 功能仅控制了事务执行过程中数据使用的内存,但语句使用的总内存还包括执行器等部分的内存。如果语句执行时所需的总内存(事务内存 + 执行器内存等)超过了 TiDB 的内存限制,仍然可能会出现内存不足的错误。 + +通常情况下,将系统变量 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 设置为更大的值可以解决该问题。推荐设置为 2 GiB。对于算子复杂或涉及数据量大的 SQL 语句,可能需要将该变量设置为更大的值。 ## 探索更多 From 206d352920b3c33ca67ea193238d32f3a2b9a853 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Thu, 12 Dec 2024 16:42:06 +0800 Subject: [PATCH 04/19] update descriptions --- batch-processing.md | 111 +++++++++++++++++++++++++------------------- pipelined-dml.md | 40 ++++++++-------- 2 files changed, 83 insertions(+), 68 deletions(-) diff --git a/batch-processing.md b/batch-processing.md index d92512e80290..4bc1e8fb0234 100644 --- a/batch-processing.md +++ b/batch-processing.md @@ -1,75 +1,90 @@ --- -title: 批量处理概览 -summary: 介绍了 TiDB 为批量处理场景提供的功能,包括 Pipelined DML、非事务性 DML、IMPORT INTO 语句、被废弃的 batch dml 等 +title: 数据批量处理 +summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipelined DML、非事务性 DML、IMPORT INTO 语句、被废弃的 batch dml。 --- -# 批量处理概览 +# 数据批量处理 -批量处理场景对 TiDB 的主要挑战在于 TiDB 内存限制了事务的大小,以及对更快的处理速度的要求。 +批量数据处理是实际业务中常见且重要的操作,它涉及到对大量数据进行高效操作,如数据迁移、批量导入、归档操作或大规模更新等。 -随着版本演进,TiDB 提供了多种批量数据处理功能,但它们之间的区别和适用场景容易混淆。本文将详细对比: -- Pipelined DML -- 非事务性 DML -- IMPORT INTO 语句 -- 已废弃 batch dml +为了提升批量处理性能,TiDB 随着版本的演进提供了多种数据批量处理功能: -通过明确每个功能的特点,帮助在批量处理场景下做出正确选择。 +- 数据导入 + - `IMPORT INTO` 语句(从 TiDB v7.2.0 开始引入、从 v7.5.0 开始 GA) +- 数据增删改 + - Pipelined DML(从 TiDB v8.0.0 开始引入,实验特性) + - 非事务性 DML(从 TiDB v6.1.0 开始引入) + - 已废弃的 batch-dml 功能 -## Pipelined DML +本文将分别介绍这些功能的主要优势、限制、使用场景,帮助你根据实际需求选择合适的方案,更高效地完成批量数据处理任务。 -Pipelined DML 在 TiDB v8.1 LTS 作为实验性特性发布,在 v8.5 LTS 内核部分功能得到完善,性能大幅提升。 +## 数据导入 -它的主要特点是: -1. 适合通用的批量数据处理场景,支持 INSERT、REPLACE、UPDATE、DELETE 操作。 -2. 事务大小不再受到 TiDB 内存限制,支持处理超大规模数据。 -3. 速度比标准 DML 更快。 -4. 通过系统变量启用,无需修改 SQL 语句。 +`IMPORT INTO` 语句专为数据导入设计,使你无需单独部署 TiDB Lightning,即可将 CSV、SQL 或 PARQUET 等格式的数据快速导入到 TiDB 的一张空表中。 -它的主要限制是: -1. 只适用于自动提交的语句。 +主要优势: -它的适用场景是:通用的批量数据处理场景,例如大量数据的插入、更新、删除等。 +- 导入速度非常快。 +- 易用性比 TiDB Lightning 更高。 -更多信息见[Pipelined DML](/pipelined-dml.md)。 +主要限制: -## 非事务 DML 语句 +- 不满足事务 ACID 性质。 +- 使用限制较多。 -非事务 DML 语句是在 TiDB v6.1 LTS 首次引入的功能,支持 DELETE。在 v6.5 中开始支持 INSERT、REPLACE、UPDATE。 +适用场景: -它的主要特点是: -- 通过将一条语句拆为多条语句执行,使得每个语句的事务更小,绕开内存限制。 -- 处理速度比标准 DML 稍快或相当。 +- 数据导入场景,例如数据迁移、数据恢复等。建议在合适的场景下,使用 IMPORT INTO 代替 TiDB Lightning。 -它的主要限制是: -- 只适用于自动提交的语句。 -- 需要修改 SQL 语句。 -- 对 SQL 语句本身限制较多,不符合条件的语句可能需要改写。 -- 因为拆分执行,不具有完整的事务 ACID 性质,在失败时语句可能部分完成。 +更多信息,请参考 [IMPORT INTO](/sql-statements/sql-statement-import-into.md)。 -它的适用场景是:大量数据的插入、更新、删除等场景。由于限制较多,建议在 Pipelined DML 不适用的场景下考虑使用。 +## 数据增删改 -更多信息见[非事务 DML 语句](/non-transactional-dml.md)。 +### Pipelined DML -## IMPORT INTO 语句 +Pipelined DML 是从 TiDB v8.0.0 开始引入的实验特性。在 v8.5.0 中,TiDB 对该功能进行了完善,其性能得到大幅提升。 -IMPORT INTO 语句是在 TiDB v7.5 LTS 首次引入的功能,专为数据导入设计,以替代 TiDB Lightning。 +主要优势: -它的主要特点是: -- 导入速度非常快。 -- 易用性比 TiDB Lightning 更高。 +- 在事务执行过程中,通过将数据持续写入存储层,而不是全部缓存在内存中,使得事务大小不再受到 TiDB 内存限制,支持处理超大规模数据。 +- 速度比标准 DML 更快。 +- 通过系统变量启用,无需修改 SQL 语句。 -它的主要限制是: -- 只适合数据导入场景。 -- 不满足事务 ACID 性质。 -- 使用限制较多。 +主要限制: + +- 只适用于[自动提交](/transaction-overview.md#自动提交)的 `INSERT`、`REPLACE`、`UPDATE`、`DELETE` 语句。 + +适用场景: + +- 通用的批量数据处理场景,例如大量数据的插入、更新、删除等。 + +更多信息,请参考[Pipelined DML](/pipelined-dml.md)。 + +### 非事务 DML 语句 + +非事务 DML 语句是从 TiDB v6.1.0 开始引入的功能。在 v6.1.0 中,该功能仅支持 `DELETE` 语句。从 v6.5.0 起,该功能新增支持 `INSERT`、`REPLACE`、`UPDATE` 语句。 + +主要优势: + +- 通过将一条 SQL 语句拆为多条语句执行,使得每个语句的事务更小,绕开内存限制。 +- 处理速度比标准 DML 稍快或相当。 + +主要限制: + +- 只适用于[自动提交](/transaction-overview.md#自动提交)的语句。 +- 需要修改 SQL 语句。 +- 对 SQL 语句本身限制较多,不符合条件的语句可能需要改写。 +- 因为 SQL 语句被拆分执行,不具有完整的事务 ACID 性质,在失败时语句可能部分完成。 + +适用场景: -它的适用场景是:数据导入场景,例如数据迁移、数据恢复等。建议在合适的场景下,使用 IMPORT INTO 代替 TiDB Lightning。 +- 大量数据的插入、更新、删除等场景。由于限制较多,建议在 Pipelined DML 不适用的场景下考虑使用。 -更多信息见[IMPORT INTO](/sql-statements/sql-statement-import-into.md)。 +更多信息,请参考[非事务 DML 语句](/non-transactional-dml.md)。 -## 已被废弃的 batch dml +### 已被废弃的 batch-dml -在 TiDB v4.0 以前用于批量处理的 batch dml 功能已被废弃,不再推荐使用。这个功能是由以下这组系统变量控制的: +在 TiDB v4.0 以前用于批量处理的 batch-dml 功能已被废弃,不再推荐使用。该功能由以下这些系统变量控制: - `tidb_batch_insert` - `tidb_batch_delete` @@ -77,6 +92,6 @@ IMPORT INTO 语句是在 TiDB v7.5 LTS 首次引入的功能,专为数据导 - `tidb_enable_batch_dml` - `tidb_dml_batch_size` -这组功能因为容易引起数据索引不一致,导致数据损坏或丢失,已被废弃。相关变量将被逐渐移除。 +因为该功能可能引起数据索引不一致,导致数据损坏或丢失,以上变量已被废弃,并计划将在未来的版本中逐渐移除。 -不建议在任何场景下使用已被废弃的 batch dml 功能。建议迁移到上面描述的其它方案。 \ No newline at end of file +不建议在任何场景下使用已被废弃的 batch dml 功能。建议选择上面描述的其它方案。 \ No newline at end of file diff --git a/pipelined-dml.md b/pipelined-dml.md index a719557e07d4..36abf709ca6c 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -15,7 +15,7 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 通过 Pipelined DML,你可以执行超大规模的 DML 操作而不必担心内存溢出问题。 -## 使用场景和作用 +## 使用场景 Pipelined DML 适用于以下场景: @@ -58,6 +58,20 @@ WHERE category = 'electronics'; DELETE /*+ SET_VAR(tidb_dml_type='bulk') */ FROM logs WHERE log_time < '2023-01-01'; ``` +## 使用限制 + +目前,Pipelined DML 存在以下使用限制: + +- 与 TiCDC、TiFlash 或 BR 尚不兼容,请勿在与这些组件有关的表上使用 Pipelined DML。强行使用可能会引发阻塞以及这些组件的 OOM 等问题。 +- 不适用于存在写入冲突的场景。在这种场景下,Pipelined DML 性能可能大幅下降,或失败回滚。 +- 在使用 Pipelined DML 执行 DML 语句的过程中,需要确保[元数据锁](/metadata-lock.md)保持开启。 +- 启用 Pipelined DML 后,TiDB 在执行 DML 语句时会自动检测以下条件是否全部符合。如果其中任一条件不符合,TiDB 会拒绝使用 Pipelined DML 执行该语句,自动回退到普通 DML 执行,并生成对应的 warning 信息: + - 仅支持[自动提交](/transaction-overview.md#自动提交)的语句。 + - 仅支持 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句。 + - 操作的表不包含[临时表](/temporary-tables.md)或[缓存表](/cached-tables.md)。 + - 当[外键约束](/foreign-key.md)检查开启 (`foreign_key_checks = ON`)时,操作的表不包含外键关系。 +- 当使用 Pipelined DML 执行 `INSERT IGNORE ... ON DUPLICATE KEY UPDATE` 语句时,如果更新操作发生冲突,可能会返回 `Duplicate entry` 错误。 + ## 使用方法 本小节介绍如何启用 Pipelined DML 并验证其是否生效。 @@ -88,20 +102,6 @@ SELECT @@tidb_last_txn_info; 如果返回结果中 `pipelined` 字段为 `true`,则表示成功使用了 Pipelined DML。 -## 使用限制 - -目前,Pipelined DML 存在以下使用限制: - -- 与 TiCDC、TiFlash 或 BR 尚不兼容,请勿在与这些组件有关的表上使用 Pipelined DML。强行使用可能会引发阻塞以及这些组件的 OOM 等问题。 -- 不适用于存在写写冲突的场景。在这种场景下,Pipelined DML 性能可能大幅下降,或失败回滚。 -- 在 DML 语句执行过程中,需要确保[元数据锁](/metadata-lock.md)保持开启。 -- 使用 Pipelined DML 时,TiDB 会自动检测以下条件是否全部符合。如果其中任一条件不符合,TiDB 会拒绝使用 Pipelined DML 执行,自动回退到普通 DML 执行,并生成对应的 warning 信息: - - 仅支持自动提交的语句 - - 仅支持 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句。 - - 操作的表不包含[临时表](/temporary-tables.md)或[缓存表](/cached-tables.md)。 - - 当外键约束检查开启 (`foreign_key_checks = ON`)时,操作的表不包含外键关系。 -- 当使用 Pipelined DML 执行 `INSERT IGNORE ... ON DUPLICATE KEY UPDATE` 语句时,如果更新操作发生冲突,可能会返回 `Duplicate entry` 错误。 - ## 最佳实践 - 将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 略微调大,以确保执行器等部分的内存使用不会超过限制。建议至少设置为 2 GiB。对于 TiDB 内存充足的情况,可以适当调大。 @@ -109,11 +109,11 @@ SELECT @@tidb_last_txn_info; ## 相关配置 -- 系统变量 [`tidb_dml_type`](/system-variables.md#tidb_dml_type-从-v800-版本开始引入):用于控制是否启用 Pipelined DML。 -- 配置项[`pessimistic-auto-commit`](/tidb-configuration-file.md#pessimistic-auto-commit):当使用 Pipelined DML 时,该配置项的效果等同于设置为 `false`。 +- 系统变量 [`tidb_dml_type`](/system-variables.md#tidb_dml_type-从-v800-版本开始引入) 用于控制是否在会话级别启用 Pipelined DML。 +- 当 [`tidb_dml_type`](/system-variables.md#tidb_dml_type-从-v800-版本开始引入) 设置为 `"bulk"` 时,配置项 [`pessimistic-auto-commit`](/tidb-configuration-file.md#pessimistic-auto-commit) 的效果等同于设置为 `false`。 +- 以 Pipelined DML 方式执行事务时,事务的大小不受 TiDB 配置项 [`txn-total-size-limit`](/tidb-configuration-file.md#txn-total-size-limit) 的限制。 - 以 Pipelined DML 方式执行超大事务时,事务耗时可能较长。对于这种模式的事务,其事务锁的最大 TTL 为 [`max-txn-ttl`](/tidb-configuration-file.md#max-txn-ttl) 与 24 小时中的较大值。 - 当事务执行时间超过 [`tidb_gc_max_wait_time`](/system-variables.md#tidb_gc_max_wait_time-从-v610-版本开始引入) 设定值后,GC 可能会强制回滚事务,导致事务失败。 -- 以 `"bulk"` 方式执行事务时,事务的大小不受 TiDB 配置项 [`txn-total-size-limit`](/tidb-configuration-file.md#txn-total-size-limit) 的限制。 ## 观测 Pipelined DML @@ -128,7 +128,7 @@ SELECT @@tidb_last_txn_info; ### 为什么我的查询没有使用 Pipelined DML? -当 TiDB 拒绝以 Pipelined DML 模式执行语句时,会生成对应的 warning,可以通过检查 warning 信息 (`SHOW WARNINGS;`) 得知原因。 +当 TiDB 拒绝以 Pipelined DML 模式执行语句时,会生成对应的警告信息,可以通过检查警告信息 (`SHOW WARNINGS;`) 确定原因。 常见的原因: @@ -148,7 +148,7 @@ SELECT @@tidb_last_txn_info; The query has been canceled due to exceeding the memory limit allowed for a single SQL query. Please try to narrow the query scope or increase the tidb_mem_quota_query limit, and then try again. ``` -这是因为 Pipelined DML 功能仅控制了事务执行过程中数据使用的内存,但语句使用的总内存还包括执行器等部分的内存。如果语句执行时所需的总内存(事务内存 + 执行器内存等)超过了 TiDB 的内存限制,仍然可能会出现内存不足的错误。 +这是因为 Pipelined DML 功能仅能控制事务执行过程中数据使用的内存,但语句执行时使用的总内存还包括执行器等部分的内存。如果语句执行时所需的总内存超过了 TiDB 的内存限制,仍然可能会出现内存不足的错误。 通常情况下,将系统变量 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 设置为更大的值可以解决该问题。推荐设置为 2 GiB。对于算子复杂或涉及数据量大的 SQL 语句,可能需要将该变量设置为更大的值。 From 094337298c0837301e0b1e922de16d334c280ebe Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Thu, 12 Dec 2024 16:42:38 +0800 Subject: [PATCH 05/19] Update TOC.md --- TOC.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TOC.md b/TOC.md index 8b280fb7cdff..8d337a604863 100644 --- a/TOC.md +++ b/TOC.md @@ -349,7 +349,7 @@ - [Load Base Split 使用文档](/configure-load-base-split.md) - [Store Limit 使用文档](/configure-store-limit.md) - [DDL 执行原理及最佳实践](/ddl-introduction.md) - - [批量处理概览](/batch-processing.md) + - [数据批量处理](/batch-processing.md) - PD 微服务使用文档 - [PD 微服务概览](/pd-microservices.md) - [使用 TiUP 扩容缩容 PD 微服务节点](/scale-microservices-using-tiup.md) From 5275c2165219ff044df449031293a6578cfffb3e Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Thu, 12 Dec 2024 17:09:55 +0800 Subject: [PATCH 06/19] move hint usage to enabling steps --- batch-processing.md | 4 ++-- pipelined-dml.md | 36 ++++++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/batch-processing.md b/batch-processing.md index 4bc1e8fb0234..f8d4a809535f 100644 --- a/batch-processing.md +++ b/batch-processing.md @@ -58,7 +58,7 @@ Pipelined DML 是从 TiDB v8.0.0 开始引入的实验特性。在 v8.5.0 中, - 通用的批量数据处理场景,例如大量数据的插入、更新、删除等。 -更多信息,请参考[Pipelined DML](/pipelined-dml.md)。 +更多信息,请参考 [Pipelined DML](/pipelined-dml.md)。 ### 非事务 DML 语句 @@ -94,4 +94,4 @@ Pipelined DML 是从 TiDB v8.0.0 开始引入的实验特性。在 v8.5.0 中, 因为该功能可能引起数据索引不一致,导致数据损坏或丢失,以上变量已被废弃,并计划将在未来的版本中逐渐移除。 -不建议在任何场景下使用已被废弃的 batch dml 功能。建议选择上面描述的其它方案。 \ No newline at end of file +不建议在任何场景下使用已被废弃的 batch-dml 功能。建议选择上面描述的其它方案。 \ No newline at end of file diff --git a/pipelined-dml.md b/pipelined-dml.md index 36abf709ca6c..8f2840f43514 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -42,22 +42,26 @@ INSERT INTO sales_archive SELECT * FROM sales WHERE sale_date < '2023-01-01'; ### 批量数据更新场景 -当需要对大量数据进行更新操作时,例如批量调整商品价格或更新用户状态,Pipelined DML 可以高效完成操作: +当需要对大量数据进行更新操作时,例如批量调整商品价格或更新用户状态: ```sql -UPDATE /*+ SET_VAR(tidb_dml_type='bulk') */ products +UPDATE products SET price = price * 1.1 WHERE category = 'electronics'; ``` +使用 Pipelined DML 可以高效完成更新操作。 + ### 批量删除场景 -当需要删除大量数据时,例如删除历史数据或清理过期数据,Pipelined DML 可以高效完成操作: +当需要删除大量数据时,例如删除历史数据或清理过期数据: ```sql -DELETE /*+ SET_VAR(tidb_dml_type='bulk') */ FROM logs WHERE log_time < '2023-01-01'; +DELETE FROM logs WHERE log_time < '2023-01-01'; ``` +使用 Pipelined DML 可以高效完成删除操作。 + ## 使用限制 目前,Pipelined DML 存在以下使用限制: @@ -86,11 +90,27 @@ DELETE /*+ SET_VAR(tidb_dml_type='bulk') */ FROM logs WHERE log_time < '2023-01- SET tidb_dml_type = "bulk"; ``` -- 如需为某一条 DML 语句启用 Pipelined DML,请在该语句中添加 SET_VAR hint,例如: +- 如需为某一条 DML 语句启用 Pipelined DML,请在该语句中添加 SET_VAR hint。 - ```sql - INSERT /*+ SET_VAR(tidb_dml_type='bulk') */ INTO target_table SELECT * FROM source_table; - ``` + - 数据归档示例: + + ```sql + INSERT /*+ SET_VAR(tidb_dml_type='bulk') */ INTO target_table SELECT * FROM source_table; + ``` + + - 批量数据更新示例: + + ```sql + UPDATE /*+ SET_VAR(tidb_dml_type='bulk') */ products + SET price = price * 1.1 + WHERE category = 'electronics'; + ``` + + - 批量删除示例: + + ```sql + DELETE /*+ SET_VAR(tidb_dml_type='bulk') */ FROM logs WHERE log_time < '2023-01-01'; + ``` ### 验证是否生效 From dbe9bdb283495387ff126b9a5f151874e7a9f0c1 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Fri, 13 Dec 2024 10:52:41 +0800 Subject: [PATCH 07/19] Update pipelined-dml.md --- pipelined-dml.md | 46 +++++++++++++++------------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 8f2840f43514..4ad359a2cae6 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -19,48 +19,32 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 Pipelined DML 适用于以下场景: -- 大规模数据的迁移或归档操作 -- 批量数据的导入或更新 -- 涉及大量数据写入的 ETL (Extract, Transform, Load) 数据处理 -- 降低大规模数据写入的内存占用 +- **大规模数据的迁移或归档** -在这些场景中,Pipelined DML 具有以下优势: + 例如,将历史数据从活跃表归档到归档表。 -- 事务使用内存可控,事务大小不受 TiDB 内存总量限制。事务部分内存使用限制在 1 GiB 以内。 -- 延迟更低,事务执行效率更高。 -- CPU 和 IO 负载更平滑。 +- **批量数据的导入或更新** -### 数据归档场景 + 例如,批量调整商品价格或更新用户状态。 -当需要将历史数据从活跃表归档到归档表时,通常涉及大量数据迁移。例如: +- **批量数据的删除** -```sql -INSERT INTO sales_archive SELECT * FROM sales WHERE sale_date < '2023-01-01'; -``` - -使用 Pipelined DML 可以有效处理数百万行数据的迁移,避免 OOM 问题。 + 例如,删除历史数据或清理过期数据。 -### 批量数据更新场景 +- **涉及大量数据的 ETL (Extract, Transform, Load) 数据处理** -当需要对大量数据进行更新操作时,例如批量调整商品价格或更新用户状态: + 例如,从多个数据源提取数据,进行必要的转换处理后,加载到目标数据库或数据仓库。 -```sql -UPDATE products -SET price = price * 1.1 -WHERE category = 'electronics'; -``` +- **大规模写入内存优化** -使用 Pipelined DML 可以高效完成更新操作。 + 降低大规模数据写入操作对系统内存的占用。 -### 批量删除场景 - -当需要删除大量数据时,例如删除历史数据或清理过期数据: - -```sql -DELETE FROM logs WHERE log_time < '2023-01-01'; -``` +在这些场景中,Pipelined DML 具有以下优势: -使用 Pipelined DML 可以高效完成删除操作。 +- 事务使用内存可控,事务大小不受 TiDB 内存总量限制。事务部分内存使用限制在 1 GiB 以内。 +- 有效处理数百万行数据的迁移,避免 OOM 问题。 +- 延迟更低,事务执行效率更高。 +- CPU 和 IO 负载更平滑。 ## 使用限制 From daf1cf4744005842d1488a0db317a4c6aea3ecfd Mon Sep 17 00:00:00 2001 From: ekexium Date: Fri, 13 Dec 2024 12:30:07 +0800 Subject: [PATCH 08/19] rework introduction section Signed-off-by: ekexium --- pipelined-dml.md | 43 ++++++++++++++----------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 4ad359a2cae6..de7c8df25272 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -11,40 +11,25 @@ summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小 本文介绍 Pipelined DML 的使用场景、使用方法、使用限制和使用该功能的常见问题。 -Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大规模数据写入场景的性能。启用 Pipelined DML 后,当执行 DML 操作时,TiDB 会将相应的数据持续写入存储层,而不是全部缓存在内存中。这种方式就像流水线(Pipeline)一样,数据一边被读取(输入),一边被写入到存储层(输出),从而显著降低 DML 操作对内存的占用,提升大规模数据的写入性能。 +## 功能概述 -通过 Pipelined DML,你可以执行超大规模的 DML 操作而不必担心内存溢出问题。 +Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大规模数据写入场景的性能。启用 Pipelined DML 后,当执行 DML 操作时,TiDB 会将相应的数据持续写入存储层,而不是全部缓存在内存中。这种方式就像流水线(Pipeline)一样,数据一边被读取(输入),一边被写入到存储层(输出),从而解决了大规模 DML 操作的以下常见问题: -## 使用场景 +- 内存限制:传统 DML 在处理大量数据时容易导致 OOM +- 性能瓶颈:大事务执行效率低,容易引起系统负载波动 +- 操作限制:受限于 TiDB 内存总量,难以执行超大规模数据处理 -Pipelined DML 适用于以下场景: +启用此功能后,你可以: +- 执行不受 TiDB 内存限制的大规模数据操作 +- 获得更平稳的系统负载和更低的操作延迟 +- 将事务内存使用控制在可预测范围内(在 1 GiB 以内) -- **大规模数据的迁移或归档** +当你遇到以下情况时,建议考虑使用 Pipelined DML: +- 需要处理数百万行及以上级别的数据写入 +- 执行 DML 时遇到内存不足错误 +- 大规模数据操作导致系统负载波动明显 - 例如,将历史数据从活跃表归档到归档表。 - -- **批量数据的导入或更新** - - 例如,批量调整商品价格或更新用户状态。 - -- **批量数据的删除** - - 例如,删除历史数据或清理过期数据。 - -- **涉及大量数据的 ETL (Extract, Transform, Load) 数据处理** - - 例如,从多个数据源提取数据,进行必要的转换处理后,加载到目标数据库或数据仓库。 - -- **大规模写入内存优化** - - 降低大规模数据写入操作对系统内存的占用。 - -在这些场景中,Pipelined DML 具有以下优势: - -- 事务使用内存可控,事务大小不受 TiDB 内存总量限制。事务部分内存使用限制在 1 GiB 以内。 -- 有效处理数百万行数据的迁移,避免 OOM 问题。 -- 延迟更低,事务执行效率更高。 -- CPU 和 IO 负载更平滑。 +需要注意的是,虽然 Pipelined DML 显著降低了事务处理的内存需求,但执行大规模数据操作时仍需要合理的内存空间(建议至少 2 GiB)来支持执行器等其他模块的运行。 ## 使用限制 From a0eb4c7d8a4f4e9fc0b452e135ac6e405bbef0e0 Mon Sep 17 00:00:00 2001 From: ekexium Date: Fri, 13 Dec 2024 14:17:16 +0800 Subject: [PATCH 09/19] Apply suggestions from code review Co-authored-by: Grace Cai --- pipelined-dml.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index de7c8df25272..eec82946a6c4 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -20,13 +20,15 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 - 操作限制:受限于 TiDB 内存总量,难以执行超大规模数据处理 启用此功能后,你可以: + - 执行不受 TiDB 内存限制的大规模数据操作 - 获得更平稳的系统负载和更低的操作延迟 - 将事务内存使用控制在可预测范围内(在 1 GiB 以内) -当你遇到以下情况时,建议考虑使用 Pipelined DML: -- 需要处理数百万行及以上级别的数据写入 -- 执行 DML 时遇到内存不足错误 +在以下场景中,建议考虑启用 Pipelined DML: + +- 需要处理数百万行或更多数据的写入 +- 执行 DML 操作时遇到内存不足错误 - 大规模数据操作导致系统负载波动明显 需要注意的是,虽然 Pipelined DML 显著降低了事务处理的内存需求,但执行大规模数据操作时仍需要合理的内存空间(建议至少 2 GiB)来支持执行器等其他模块的运行。 From afe2447f6aa53cd0be6fb1d51f80d82669631d4e Mon Sep 17 00:00:00 2001 From: ekexium Date: Fri, 13 Dec 2024 14:20:02 +0800 Subject: [PATCH 10/19] apply suggestion Signed-off-by: ekexium --- pipelined-dml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index eec82946a6c4..cb4e43dcd937 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -31,7 +31,7 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 - 执行 DML 操作时遇到内存不足错误 - 大规模数据操作导致系统负载波动明显 -需要注意的是,虽然 Pipelined DML 显著降低了事务处理的内存需求,但执行大规模数据操作时仍需要合理的内存空间(建议至少 2 GiB)来支持执行器等其他模块的运行。 +需要注意的是,虽然 Pipelined DML 能显著降低事务处理的内存需求,但执行大规模数据操作时,仍需要[设置合理的内存阈值](/system-variables.md#tidb_mem_quota_query)(建议至少 2 GiB),以确保除事务以外其他模块(如执行器)的正常运行。 ## 使用限制 From ad34229052c59cc46f8a4df71a40fb1698120c24 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Fri, 13 Dec 2024 15:05:59 +0800 Subject: [PATCH 11/19] fix a broken link --- pipelined-dml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index cb4e43dcd937..a82f926ad107 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -55,7 +55,7 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 根据需要,你可以选择以下方式之一启用 Pipelined DML: -- 如需在会话级别启用 Pipelined DML,请将 [`tidb_dml_type`](system-variables.md#tidb_dml_type-从-v800-版本开始引入) 变量设置为 `"bulk"`: +- 如需在会话级别启用 Pipelined DML,请将 [`tidb_dml_type`](/system-variables.md#tidb_dml_type-从-v800-版本开始引入) 变量设置为 `"bulk"`: ```sql SET tidb_dml_type = "bulk"; From ccf8d2c5e41df48b5998ff7d217b7c6a77b19f25 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Fri, 13 Dec 2024 15:10:59 +0800 Subject: [PATCH 12/19] Update system-variables.md --- system-variables.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system-variables.md b/system-variables.md index 4c34f1e9d739..5e5259a30f8e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1627,8 +1627,7 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 可选值:`"standard"`、`"bulk"` - 该变量用来设置 DML 语句的执行方式。 - `"standard"` 表示使用标准的 DML 执行方式,TiDB 事务在提交前缓存在内存中。适用于处理高并发且可能存在冲突的事务场景,为默认推荐使用的执行方式。 - - `"bulk"` 表示使用批量 DML 执行方式,适合于处理因大量数据写入导致 TiDB 内存使用过多的情况。 - - `"bulk"` 方式目前由 Pipelined DML 特性实现,可见 [Pipelined DML](/pipelined-dml.md)。 + - `"bulk"` 表示使用 Pipelined DML 执行方式,适合于处理因大量数据写入导致 TiDB 内存使用过多的情况。更多信息,请参考 [Pipelined DML](/pipelined-dml.md)。 ### `tidb_enable_1pc` 从 v5.0 版本开始引入 From 9c8cdfe6e306b3ee147b5d611417a5b37966b628 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Wed, 25 Dec 2024 09:35:23 +0800 Subject: [PATCH 13/19] Apply suggestions from code review Co-authored-by: Aolin --- batch-processing.md | 6 +++--- pipelined-dml.md | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/batch-processing.md b/batch-processing.md index f8d4a809535f..f739b5587358 100644 --- a/batch-processing.md +++ b/batch-processing.md @@ -10,7 +10,7 @@ summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipe 为了提升批量处理性能,TiDB 随着版本的演进提供了多种数据批量处理功能: - 数据导入 - - `IMPORT INTO` 语句(从 TiDB v7.2.0 开始引入、从 v7.5.0 开始 GA) + - `IMPORT INTO` 语句(从 TiDB v7.2.0 开始引入,在 v7.5.0 成为正式功能) - 数据增删改 - Pipelined DML(从 TiDB v8.0.0 开始引入,实验特性) - 非事务性 DML(从 TiDB v6.1.0 开始引入) @@ -20,7 +20,7 @@ summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipe ## 数据导入 -`IMPORT INTO` 语句专为数据导入设计,使你无需单独部署 TiDB Lightning,即可将 CSV、SQL 或 PARQUET 等格式的数据快速导入到 TiDB 的一张空表中。 +`IMPORT INTO` 语句专为数据导入设计,使你无需单独部署 [TiDB Lightning](/tidb-lightning/tidb-lightning-overview.md),即可将 CSV、SQL 或 PARQUET 等格式的数据快速导入到 TiDB 的一张空表中。 主要优势: @@ -29,7 +29,7 @@ summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipe 主要限制: -- 不满足事务 ACID 性质。 +- 不满足事务 [ACID](/glossary.md#acid) 性质。 - 使用限制较多。 适用场景: diff --git a/pipelined-dml.md b/pipelined-dml.md index a82f926ad107..7e73ff4d76ce 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -13,7 +13,7 @@ summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小 ## 功能概述 -Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大规模数据写入场景的性能。启用 Pipelined DML 后,当执行 DML 操作时,TiDB 会将相应的数据持续写入存储层,而不是全部缓存在内存中。这种方式就像流水线(Pipeline)一样,数据一边被读取(输入),一边被写入到存储层(输出),从而解决了大规模 DML 操作的以下常见问题: +Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大规模数据写入场景的性能。启用 Pipelined DML 后,当执行 DML 操作时,TiDB 会将相应的数据持续写入存储层,而不是全部缓存在内存中。这种方式就像流水线 (Pipeline) 一样,数据一边被读取(输入),一边被写入到存储层(输出),从而解决了大规模 DML 操作的以下常见问题: - 内存限制:传统 DML 在处理大量数据时容易导致 OOM - 性能瓶颈:大事务执行效率低,容易引起系统负载波动 @@ -44,7 +44,7 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 - 仅支持[自动提交](/transaction-overview.md#自动提交)的语句。 - 仅支持 `INSERT`、`UPDATE`、`REPLACE` 和 `DELETE` 语句。 - 操作的表不包含[临时表](/temporary-tables.md)或[缓存表](/cached-tables.md)。 - - 当[外键约束](/foreign-key.md)检查开启 (`foreign_key_checks = ON`)时,操作的表不包含外键关系。 + - 当[外键约束](/foreign-key.md)检查开启 (`foreign_key_checks = ON`) 时,操作的表不包含外键关系。 - 当使用 Pipelined DML 执行 `INSERT IGNORE ... ON DUPLICATE KEY UPDATE` 语句时,如果更新操作发生冲突,可能会返回 `Duplicate entry` 错误。 ## 使用方法 @@ -61,7 +61,7 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 SET tidb_dml_type = "bulk"; ``` -- 如需为某一条 DML 语句启用 Pipelined DML,请在该语句中添加 SET_VAR hint。 +- 如需为某一条 DML 语句启用 Pipelined DML,请在该语句中添加 [`SET_VAR`](/optimizer-hints.md#set_varvar_namevar_value) hint。 - 数据归档示例: @@ -85,7 +85,7 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 ### 验证是否生效 -执行 DML 语句后,可以查看 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入) 变量来确认该语句的执行是否使用了 Pipelined DML: +执行 DML 语句后,可以查看 [`tidb_last_txn_info`](/system-variables.md#tidb_last_txn_info-从-v409-版本开始引入) 变量来确认该语句的执行是否使用了 Pipelined DML: ```sql SELECT @@tidb_last_txn_info; @@ -96,7 +96,7 @@ SELECT @@tidb_last_txn_info; ## 最佳实践 - 将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 略微调大,以确保执行器等部分的内存使用不会超过限制。建议至少设置为 2 GiB。对于 TiDB 内存充足的情况,可以适当调大。 -- 在向新表插入数据的场景,Pipelined DML 易受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考[TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md#tidb-热点问题处理)。 +- 在向新表插入数据的场景,Pipelined DML 易受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考 [TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md#tidb-热点问题处理)。 ## 相关配置 From 630a21108de415b49bb136cbf9dc4d55c5f9699a Mon Sep 17 00:00:00 2001 From: ekexium Date: Wed, 25 Dec 2024 10:55:57 +0800 Subject: [PATCH 14/19] Apply suggestions from code review Co-authored-by: Aolin Co-authored-by: Grace Cai --- batch-processing.md | 8 ++++---- pipelined-dml.md | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/batch-processing.md b/batch-processing.md index f739b5587358..940ab0ae52f4 100644 --- a/batch-processing.md +++ b/batch-processing.md @@ -1,6 +1,6 @@ --- title: 数据批量处理 -summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipelined DML、非事务性 DML、IMPORT INTO 语句、被废弃的 batch dml。 +summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipelined DML、非事务性 DML、IMPORT INTO 语句以及已被废弃的 batch-dml。 --- # 数据批量处理 @@ -16,7 +16,7 @@ summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipe - 非事务性 DML(从 TiDB v6.1.0 开始引入) - 已废弃的 batch-dml 功能 -本文将分别介绍这些功能的主要优势、限制、使用场景,帮助你根据实际需求选择合适的方案,更高效地完成批量数据处理任务。 +本文分别介绍这些功能的主要优势、限制和使用场景,帮助你根据实际需求选择合适的方案,从而更高效地完成批量数据处理任务。 ## 数据导入 @@ -36,7 +36,7 @@ summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipe - 数据导入场景,例如数据迁移、数据恢复等。建议在合适的场景下,使用 IMPORT INTO 代替 TiDB Lightning。 -更多信息,请参考 [IMPORT INTO](/sql-statements/sql-statement-import-into.md)。 +更多信息,请参考 [`IMPORT INTO`](/sql-statements/sql-statement-import-into.md)。 ## 数据增删改 @@ -84,7 +84,7 @@ Pipelined DML 是从 TiDB v8.0.0 开始引入的实验特性。在 v8.5.0 中, ### 已被废弃的 batch-dml -在 TiDB v4.0 以前用于批量处理的 batch-dml 功能已被废弃,不再推荐使用。该功能由以下这些系统变量控制: +TiDB 在 v4.0 之前提供了 batch-dml 功能,用于批量数据处理。该功能已被废弃,不再推荐使用。batch-dml 功能由以下这些系统变量控制: - `tidb_batch_insert` - `tidb_batch_delete` diff --git a/pipelined-dml.md b/pipelined-dml.md index 7e73ff4d76ce..955c83726cdd 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -1,6 +1,6 @@ --- title: Pipelined DML -summary: Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小不再受到 TiDB 内存限制。 +summary: 介绍 Pipelined DML 的使用场景、使用方法、使用限制和使用该功能的常见问题。Pipelined DML 增强了 TiDB 批量处理的能力,使得事务大小不再受到 TiDB 内存限制。 --- # Pipelined DML From 0d6086be71821881426e94d51beefbdf1b2cb37d Mon Sep 17 00:00:00 2001 From: ekexium Date: Wed, 25 Dec 2024 12:44:06 +0800 Subject: [PATCH 15/19] Update batch-processing.md Co-authored-by: Aolin --- batch-processing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/batch-processing.md b/batch-processing.md index 940ab0ae52f4..55fdce1c8243 100644 --- a/batch-processing.md +++ b/batch-processing.md @@ -25,7 +25,7 @@ summary: 介绍了 TiDB 为数据批量处理场景提供的功能,包括 Pipe 主要优势: - 导入速度非常快。 -- 易用性比 TiDB Lightning 更高。 +- 比 TiDB Lightning 更易用。 主要限制: From a2e59040b65ac2fdf4a13860fcf064c2f7d13b14 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Thu, 26 Dec 2024 18:17:58 +0800 Subject: [PATCH 16/19] fix a broken link --- pipelined-dml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 955c83726cdd..21592619b81f 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -110,7 +110,7 @@ SELECT @@tidb_last_txn_info; 你可以通过以下方式观测 Pipelined DML 的执行过程: -- 查看系统变量 [`tidb_last_txn_info`](#tidb_last_txn_info-从-v409-版本开始引入),获取当前会话上一个事务的执行信息,包括是否使用了 Pipelined DML。 +- 查看系统变量 [`tidb_last_txn_info`](/system-variables.md#tidb_last_txn_info-从-v409-版本开始引入),获取当前会话上一个事务的执行信息,包括是否使用了 Pipelined DML。 - 查看 TiDB 日志中包含 `"[pipelined dml]"` 字样的行,了解 Pipelined DML 的执行过程和进度,包括当前阶段、已经写入的数据量等。 - 查看 TiDB 日志中的 [`expensive query` 日志](/identify-expensive-queries.md#expensive-query-日志示例)的 `affected rows` 字段,获取耗时较长语句的当前进度。 - 查看 [`INFORMATION_SCHEMA.PROCESSLIST`](/information-schema/information-schema-processlist.md) 表,了解事务的执行进度。Pipelined DML 通常用于大事务,执行耗时较长,可以通过该表查看事务的执行进度。 From e82b7fb1c467514ff1622e9f6cab34ea8b5fc9e9 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Fri, 27 Dec 2024 16:56:11 +0800 Subject: [PATCH 17/19] minor wording updates --- pipelined-dml.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 21592619b81f..3352d8c2b593 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -96,7 +96,7 @@ SELECT @@tidb_last_txn_info; ## 最佳实践 - 将 [`tidb_mem_quota_query`](/system-variables.md#tidb_mem_quota_query) 略微调大,以确保执行器等部分的内存使用不会超过限制。建议至少设置为 2 GiB。对于 TiDB 内存充足的情况,可以适当调大。 -- 在向新表插入数据的场景,Pipelined DML 易受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考 [TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md#tidb-热点问题处理)。 +- 在向新表插入数据的场景,Pipelined DML 性能易受到热点影响。为实现最佳性能,建议尽可能先打散热点。可以参考 [TiDB 热点问题处理](/troubleshoot-hot-spot-issues.md)。 ## 相关配置 From 4633326c9bbdbde83124b1e0b68fe608c7b3baa4 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Mon, 6 Jan 2025 15:51:36 +0800 Subject: [PATCH 18/19] remove a line with duplicated meaning --- pipelined-dml.md | 1 - 1 file changed, 1 deletion(-) diff --git a/pipelined-dml.md b/pipelined-dml.md index 3352d8c2b593..dd2e8fd26839 100644 --- a/pipelined-dml.md +++ b/pipelined-dml.md @@ -17,7 +17,6 @@ Pipelined DML 是 TiDB 从 v8.0.0 开始引入的实验特性,用于优化大 - 内存限制:传统 DML 在处理大量数据时容易导致 OOM - 性能瓶颈:大事务执行效率低,容易引起系统负载波动 -- 操作限制:受限于 TiDB 内存总量,难以执行超大规模数据处理 启用此功能后,你可以: From f2d6c191a28029b094a235778068b6244a9903d9 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Wed, 8 Jan 2025 16:25:14 +0800 Subject: [PATCH 19/19] Update batch-processing.md --- batch-processing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/batch-processing.md b/batch-processing.md index 55fdce1c8243..96623010cbdb 100644 --- a/batch-processing.md +++ b/batch-processing.md @@ -47,7 +47,7 @@ Pipelined DML 是从 TiDB v8.0.0 开始引入的实验特性。在 v8.5.0 中, 主要优势: - 在事务执行过程中,通过将数据持续写入存储层,而不是全部缓存在内存中,使得事务大小不再受到 TiDB 内存限制,支持处理超大规模数据。 -- 速度比标准 DML 更快。 +- 性能比标准 DML 更好。 - 通过系统变量启用,无需修改 SQL 语句。 主要限制: