From fc89882079f50aeebb921f5899e0baa798a0f03b Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Mon, 22 Jul 2024 16:21:58 +0800 Subject: [PATCH 01/12] add system variable for lazy cursor fetch Signed-off-by: Yang Keao --- system-variables.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/system-variables.md b/system-variables.md index e4037a1ac065..9ca7d0e3df7d 100644 --- a/system-variables.md +++ b/system-variables.md @@ -2441,6 +2441,24 @@ Query OK, 0 rows affected (0.09 sec) - 这个变量用于控制是否开启 [TiCDC 单行数据正确性校验](/ticdc/ticdc-integrity-check.md)功能。 - 你可以使用 [`TIDB_ROW_CHECKSUM()`](/functions-and-operators/tidb-functions.md#tidb_row_checksum) 函数查询行数据的 Checksum 值。 +### `tidb_enable_lazy_cursor_fetch` 从 v8.3.0 版本开始引入 + +> **警告:** +> +> 该变量控制的功能为实验特性,不建议在生产环境中使用。 + +- 作用域:GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 类型:布尔型 +- 默认值:`OFF` +- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。在变量为 `OFF` 时,开启 Cursor Fetch 的情况下,TiDB 将在语句开始执行时将所有数据读取完成并保存在 TiDB 内存中,并在后续客户端读取的过程中依据客户端指定 `FetchSize` 返回给客户端,如果结果集过大,可能触发落盘临时将结果写入硬盘。在变量为 `ON` 时,开启 Cursor Fetch 的情况下,TiDB 将不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 +- 该功能存在如下限制: + - 1. 不支持处于显式事务中的语句。 + - 2. 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 + - 3. 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [Statements Summary](/statement-summary-tables.md) 和 [Slow Log](/identify-slow-queries.md) 中。 +- 对于暂不支持的场景,行为将会与变量为 `OFF` 时保持一致。 + ### `tidb_enforce_mpp` 从 v5.1 版本开始引入 - 作用域:SESSION From d975cf79f0fe2f179f06109c2e41faf8c91a0c4b Mon Sep 17 00:00:00 2001 From: lilin90 Date: Mon, 29 Jul 2024 16:24:07 +0800 Subject: [PATCH 02/12] Update in alphabetical order --- system-variables.md | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/system-variables.md b/system-variables.md index 9ca7d0e3df7d..35bcb51dc58e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1926,6 +1926,24 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 可选值:`OFF`,`ON` - 这个变量用于控制是否支持对分区表创建 `Global index`。`Global index` 当前正处于开发阶段,**不推荐修改该变量值**。 +### `tidb_enable_lazy_cursor_fetch` 从 v8.3.0 版本开始引入 + +> **警告:** +> +> 该变量控制的功能为实验特性,不建议在生产环境中使用。 + +- 作用域:GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 类型:布尔型 +- 默认值:`OFF` +- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。在变量为 `OFF` 时,开启 Cursor Fetch 的情况下,TiDB 将在语句开始执行时将所有数据读取完成并保存在 TiDB 内存中,并在后续客户端读取的过程中依据客户端指定 `FetchSize` 返回给客户端,如果结果集过大,可能触发落盘临时将结果写入硬盘。在变量为 `ON` 时,开启 Cursor Fetch 的情况下,TiDB 将不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 +- 该功能存在如下限制: + - 1. 不支持处于显式事务中的语句。 + - 2. 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 + - 3. 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [Statements Summary](/statement-summary-tables.md) 和 [Slow Log](/identify-slow-queries.md) 中。 +- 对于暂不支持的场景,行为将会与变量为 `OFF` 时保持一致。 + ### `tidb_enable_non_prepared_plan_cache` - 作用域:SESSION | GLOBAL @@ -2441,24 +2459,6 @@ Query OK, 0 rows affected (0.09 sec) - 这个变量用于控制是否开启 [TiCDC 单行数据正确性校验](/ticdc/ticdc-integrity-check.md)功能。 - 你可以使用 [`TIDB_ROW_CHECKSUM()`](/functions-and-operators/tidb-functions.md#tidb_row_checksum) 函数查询行数据的 Checksum 值。 -### `tidb_enable_lazy_cursor_fetch` 从 v8.3.0 版本开始引入 - -> **警告:** -> -> 该变量控制的功能为实验特性,不建议在生产环境中使用。 - -- 作用域:GLOBAL -- 是否持久化到集群:是 -- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 -- 类型:布尔型 -- 默认值:`OFF` -- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。在变量为 `OFF` 时,开启 Cursor Fetch 的情况下,TiDB 将在语句开始执行时将所有数据读取完成并保存在 TiDB 内存中,并在后续客户端读取的过程中依据客户端指定 `FetchSize` 返回给客户端,如果结果集过大,可能触发落盘临时将结果写入硬盘。在变量为 `ON` 时,开启 Cursor Fetch 的情况下,TiDB 将不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 -- 该功能存在如下限制: - - 1. 不支持处于显式事务中的语句。 - - 2. 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 - - 3. 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [Statements Summary](/statement-summary-tables.md) 和 [Slow Log](/identify-slow-queries.md) 中。 -- 对于暂不支持的场景,行为将会与变量为 `OFF` 时保持一致。 - ### `tidb_enforce_mpp` 从 v5.1 版本开始引入 - 作用域:SESSION From 806e66b9bbce71373e575a2a4d2ae42b4895ffb5 Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Tue, 30 Jul 2024 15:40:55 +0800 Subject: [PATCH 03/12] fix according to comments Signed-off-by: Yang Keao --- system-variables.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/system-variables.md b/system-variables.md index 35bcb51dc58e..9c3fae73a28e 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1930,19 +1930,21 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; > **警告:** > -> 该变量控制的功能为实验特性,不建议在生产环境中使用。 +> 该变量控制的功能为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 - 作用域:GLOBAL - 是否持久化到集群:是 - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 - 类型:布尔型 - 默认值:`OFF` -- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。在变量为 `OFF` 时,开启 Cursor Fetch 的情况下,TiDB 将在语句开始执行时将所有数据读取完成并保存在 TiDB 内存中,并在后续客户端读取的过程中依据客户端指定 `FetchSize` 返回给客户端,如果结果集过大,可能触发落盘临时将结果写入硬盘。在变量为 `ON` 时,开启 Cursor Fetch 的情况下,TiDB 将不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 -- 该功能存在如下限制: - - 1. 不支持处于显式事务中的语句。 - - 2. 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 - - 3. 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [Statements Summary](/statement-summary-tables.md) 和 [Slow Log](/identify-slow-queries.md) 中。 -- 对于暂不支持的场景,行为将会与变量为 `OFF` 时保持一致。 +- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。 + - 当开启 Cursor Fetch 且该变量设置为 `OFF` 时,TiDB 会在语句开始执行时将所有数据读取完成并保存至 TiDB 内存,在后续客户端读取的过程中会依据客户端指定的 `FetchSize` 返回给客户端。如果结果集过大,可能会触发落盘临时将结果写入硬盘。 + - 当开启 Cursor Fetch 且该变量设置为 `ON` 时,TiDB 不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 +- 该功能存在以下限制: + - 不支持处于显式事务中的语句。 + - 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 + - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [Statements Summary](/statement-summary-tables.md) 和 [慢查询日志](/identify-slow-queries.md) 中。 +- 对于暂不支持的场景,行为与变量设置为 `OFF` 时一致。 ### `tidb_enable_non_prepared_plan_cache` From a1e13a8f515a2570ab0cba45b807787547abde6f Mon Sep 17 00:00:00 2001 From: Lilian Lee Date: Tue, 30 Jul 2024 16:59:12 +0800 Subject: [PATCH 04/12] Update wording and format --- system-variables.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system-variables.md b/system-variables.md index 9c3fae73a28e..ccebd7e2da73 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1940,11 +1940,11 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。 - 当开启 Cursor Fetch 且该变量设置为 `OFF` 时,TiDB 会在语句开始执行时将所有数据读取完成并保存至 TiDB 内存,在后续客户端读取的过程中会依据客户端指定的 `FetchSize` 返回给客户端。如果结果集过大,可能会触发落盘临时将结果写入硬盘。 - 当开启 Cursor Fetch 且该变量设置为 `ON` 时,TiDB 不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 -- 该功能存在以下限制: +- 该变量控制的功能存在以下限制: - 不支持处于显式事务中的语句。 - 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 - - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [Statements Summary](/statement-summary-tables.md) 和 [慢查询日志](/identify-slow-queries.md) 中。 -- 对于暂不支持的场景,行为与变量设置为 `OFF` 时一致。 + - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [statements summary](/statement-summary-tables.md) 和[慢查询日志](/identify-slow-queries.md)中。 +- 对于暂不支持的场景,其行为与将变量设置为 `OFF` 时一致。 ### `tidb_enable_non_prepared_plan_cache` From e6b3fc7eab1056860501bdb0fee8c35dc8146cc9 Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Wed, 31 Jul 2024 15:40:38 +0800 Subject: [PATCH 05/12] modify customcontent for tidb cloud Signed-off-by: Yang Keao --- system-variables.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/system-variables.md b/system-variables.md index ccebd7e2da73..0df197ccb683 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1932,6 +1932,8 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; > > 该变量控制的功能为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 + + - 作用域:GLOBAL - 是否持久化到集群:是 - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 @@ -1946,6 +1948,26 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [statements summary](/statement-summary-tables.md) 和[慢查询日志](/identify-slow-queries.md)中。 - 对于暂不支持的场景,其行为与将变量设置为 `OFF` 时一致。 + + + + +- 作用域:GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 类型:布尔型 +- 默认值:`OFF` +- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。 + - 当开启 Cursor Fetch 且该变量设置为 `OFF` 时,TiDB 会在语句开始执行时将所有数据读取完成并保存至 TiDB 内存,在后续客户端读取的过程中会依据客户端指定的 `FetchSize` 返回给客户端。如果结果集过大,可能会触发落盘临时将结果写入硬盘。 + - 当开启 Cursor Fetch 且该变量设置为 `ON` 时,TiDB 不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 +- 该变量控制的功能存在以下限制: + - 不支持处于显式事务中的语句。 + - 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 + - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [statements summary](/statement-summary-tables.md) 和[慢查询日志](https://docs.pingcap.com/zh/tidb/stable/identify-slow-queries)中。 +- 对于暂不支持的场景,其行为与将变量设置为 `OFF` 时一致。 + + + ### `tidb_enable_non_prepared_plan_cache` - 作用域:SESSION | GLOBAL From d6e7bf7bdb93d655dfeacb71bd3717df42a008ff Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Wed, 31 Jul 2024 15:44:51 +0800 Subject: [PATCH 06/12] remove tidb-cloud customcontent Signed-off-by: Yang Keao --- system-variables.md | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/system-variables.md b/system-variables.md index 0df197ccb683..ccebd7e2da73 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1932,8 +1932,6 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; > > 该变量控制的功能为实验特性,不建议在生产环境中使用。该功能可能会在未事先通知的情况下发生变化或删除。如果发现 bug,请在 GitHub 上提 [issue](https://github.com/pingcap/tidb/issues) 反馈。 - - - 作用域:GLOBAL - 是否持久化到集群:是 - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 @@ -1948,26 +1946,6 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [statements summary](/statement-summary-tables.md) 和[慢查询日志](/identify-slow-queries.md)中。 - 对于暂不支持的场景,其行为与将变量设置为 `OFF` 时一致。 - - - - -- 作用域:GLOBAL -- 是否持久化到集群:是 -- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 -- 类型:布尔型 -- 默认值:`OFF` -- 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。 - - 当开启 Cursor Fetch 且该变量设置为 `OFF` 时,TiDB 会在语句开始执行时将所有数据读取完成并保存至 TiDB 内存,在后续客户端读取的过程中会依据客户端指定的 `FetchSize` 返回给客户端。如果结果集过大,可能会触发落盘临时将结果写入硬盘。 - - 当开启 Cursor Fetch 且该变量设置为 `ON` 时,TiDB 不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 -- 该变量控制的功能存在以下限制: - - 不支持处于显式事务中的语句。 - - 当前仅支持包含且仅包含 `TableReader`、`IndexReader`、`IndexLookUp`、`Projection`、`Selection` 算子的执行计划。 - - 对于使用 Lazy Cursor Fetch 的语句,执行信息将不会出现在 [statements summary](/statement-summary-tables.md) 和[慢查询日志](https://docs.pingcap.com/zh/tidb/stable/identify-slow-queries)中。 -- 对于暂不支持的场景,其行为与将变量设置为 `OFF` 时一致。 - - - ### `tidb_enable_non_prepared_plan_cache` - 作用域:SESSION | GLOBAL From 31f298c75f4bca10bbfeae0ccda5784aa6565e21 Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Wed, 31 Jul 2024 16:33:12 +0800 Subject: [PATCH 07/12] add optional values according to comments Signed-off-by: Yang Keao --- system-variables.md | 1 + 1 file changed, 1 insertion(+) diff --git a/system-variables.md b/system-variables.md index ccebd7e2da73..dd640352d516 100644 --- a/system-variables.md +++ b/system-variables.md @@ -1937,6 +1937,7 @@ mysql> SELECT job_info FROM mysql.analyze_jobs ORDER BY end_time DESC LIMIT 1; - 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 - 类型:布尔型 - 默认值:`OFF` +- 可选值:`OFF`,`ON` - 这个变量用于控制 [Cursor Fetch](/develop/dev-guide-connection-parameters.md#使用-streamingresult-流式获取执行结果) 功能的行为。 - 当开启 Cursor Fetch 且该变量设置为 `OFF` 时,TiDB 会在语句开始执行时将所有数据读取完成并保存至 TiDB 内存,在后续客户端读取的过程中会依据客户端指定的 `FetchSize` 返回给客户端。如果结果集过大,可能会触发落盘临时将结果写入硬盘。 - 当开启 Cursor Fetch 且该变量设置为 `ON` 时,TiDB 不会一次把所有数据读取到 TiDB 节点,而是会随着客户端的读取不断将数据读到 TiDB 节点。 From 65418394360b7d8d8b09d980a560edd16ba5abf6 Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Thu, 1 Aug 2024 16:09:31 +0800 Subject: [PATCH 08/12] add more docs in the fetchSize doc Signed-off-by: Yang Keao --- best-practices/java-app-best-practices.md | 4 ++++ develop/dev-guide-connection-parameters.md | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/best-practices/java-app-best-practices.md b/best-practices/java-app-best-practices.md index 8b58ea6d8a99..354a5609bc53 100644 --- a/best-practices/java-app-best-practices.md +++ b/best-practices/java-app-best-practices.md @@ -66,6 +66,10 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 TiDB 中同时支持两种方式,但更推荐使用第一种将 `FetchSize` 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 +对于第二种方法,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方法使用更多的内存,如果 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 为 `ON` 时,可能会将数据存储到临时磁盘中。 + +如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。有关详细信息和限制,请阅读变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 的描述。 + ### MySQL JDBC 参数 JDBC 实现通常通过 JDBC URL 参数的形式来提供实现相关的配置。这里以 MySQL 官方的 Connector/J 来介绍[参数配置](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)(如果使用的是 MariaDB,可以参考 [MariaDB 的类似配置](https://mariadb.com/kb/en/library/about-mariadb-connector-j/#optional-url-parameters))。因为配置项较多,这里主要关注几个可能影响到性能的参数。 diff --git a/develop/dev-guide-connection-parameters.md b/develop/dev-guide-connection-parameters.md index df7f989d50c8..d7019c010dfc 100644 --- a/develop/dev-guide-connection-parameters.md +++ b/develop/dev-guide-connection-parameters.md @@ -138,6 +138,10 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 TiDB 中同时支持两种方式,但更推荐使用第一种将 **FetchSize** 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 +对于第二种方法,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方法使用更多的内存,如果 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 为 `ON` 时,可能会将数据存储到临时磁盘中。 + +如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。有关详细信息和限制,请阅读变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 的描述。 + ### MySQL JDBC 参数 JDBC 实现通常通过 JDBC URL 参数的形式来提供实现相关的配置。这里以 MySQL 官方的 Connector/J 来介绍[参数配置](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)(如果使用的是 MariaDB,可以参考 [MariaDB 的类似配置](https://mariadb.com/kb/en/library/about-mariadb-connector-j/#optional-url-parameters))。因为配置项较多,这里主要关注几个可能影响到性能的参数。 From 6b0d78d8eb8a7285960b25361f52f6a25ad9d774 Mon Sep 17 00:00:00 2001 From: Lilian Lee Date: Fri, 2 Aug 2024 14:29:52 +0800 Subject: [PATCH 09/12] Update anchor link --- develop/dev-guide-connection-parameters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop/dev-guide-connection-parameters.md b/develop/dev-guide-connection-parameters.md index d7019c010dfc..b3260f90c392 100644 --- a/develop/dev-guide-connection-parameters.md +++ b/develop/dev-guide-connection-parameters.md @@ -140,7 +140,7 @@ TiDB 中同时支持两种方式,但更推荐使用第一种将 **FetchSize** 对于第二种方法,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方法使用更多的内存,如果 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 为 `ON` 时,可能会将数据存储到临时磁盘中。 -如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。有关详细信息和限制,请阅读变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 的描述。 +如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。有关详细信息和限制,请阅读变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 的描述。 ### MySQL JDBC 参数 From 5f869f531ecc06628868d920f80a38d9d85f4b6e Mon Sep 17 00:00:00 2001 From: lilin90 Date: Fri, 2 Aug 2024 14:36:32 +0800 Subject: [PATCH 10/12] Improve wording and update links --- best-practices/java-app-best-practices.md | 10 +++++----- develop/dev-guide-connection-parameters.md | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/best-practices/java-app-best-practices.md b/best-practices/java-app-best-practices.md index 354a5609bc53..0905434d47ed 100644 --- a/best-practices/java-app-best-practices.md +++ b/best-practices/java-app-best-practices.md @@ -56,19 +56,19 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 在 JDBC 中通常有以下两种处理方式: -- 设置 [`FetchSize` 为 `Integer.MIN_VALUE`](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html#ResultSet) 让客户端不缓存,客户端通过 StreamingResult 的方式从网络连接上流式读取执行结果。 +- 方式一:设置 [`FetchSize` 为 `Integer.MIN_VALUE`](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html#ResultSet) 让客户端不缓存,客户端通过 StreamingResult 的方式从网络连接上流式读取执行结果。 使用流式读取数据时,需要将 `resultset` 读取完成或 close 后,才能继续使用该语句进行下次查询,否则会报错 `No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.`。 如果需要在 `resultset` 读取完成或 close 前进行查询避免上述报错,可在 URL 中添加配置参数 `clobberStreamingResults=true`,这样会自动 close `resultset`,但之前流式查询未被读取的结果集会丢失。 -- 使用 Cursor Fetch,首先需[设置 `FetchSize`](http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html) 为正整数,且在 JDBC URL 中配置 `useCursorFetch = true`。 +- 方式二:使用 Cursor Fetch,首先需[设置 `FetchSize`](http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html) 为正整数,且在 JDBC URL 中配置 `useCursorFetch = true`。 -TiDB 中同时支持两种方式,但更推荐使用第一种将 `FetchSize` 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 +TiDB 同时支持以上两种方式,但更推荐使用第一种将 `FetchSize` 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 -对于第二种方法,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方法使用更多的内存,如果 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 为 `ON` 时,可能会将数据存储到临时磁盘中。 +对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会将数据存储到临时磁盘中。 -如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。有关详细信息和限制,请阅读变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 的描述。 +如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 设置为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。更多信息和使用限制,参见系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 的详细描述。 ### MySQL JDBC 参数 diff --git a/develop/dev-guide-connection-parameters.md b/develop/dev-guide-connection-parameters.md index b3260f90c392..435f031ab828 100644 --- a/develop/dev-guide-connection-parameters.md +++ b/develop/dev-guide-connection-parameters.md @@ -133,14 +133,14 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 在 JDBC 中通常有以下两种处理方式: -- 设置 [**FetchSize** 为 `Integer.MIN_VALUE`](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html#ResultSet) 让客户端不缓存,客户端通过 StreamingResult 的方式从网络连接上流式读取执行结果。 -- 使用 Cursor Fetch,首先需[设置 **FetchSize**](http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html) 为正整数,且在 JDBC URL 中配置 `useCursorFetch = true`。 +- 方式一:设置 [**FetchSize** 为 `Integer.MIN_VALUE`](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html#ResultSet) 让客户端不缓存,客户端通过 StreamingResult 的方式从网络连接上流式读取执行结果。 +- 方式二:使用 Cursor Fetch,首先需[设置 **FetchSize**](http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html) 为正整数,且在 JDBC URL 中配置 `useCursorFetch = true`。 -TiDB 中同时支持两种方式,但更推荐使用第一种将 **FetchSize** 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 +TiDB 同时支持以上两种方式,但更推荐使用第一种将 **FetchSize** 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 -对于第二种方法,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方法使用更多的内存,如果 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 为 `ON` 时,可能会将数据存储到临时磁盘中。 +对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会将数据存储到临时磁盘中。 -如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。有关详细信息和限制,请阅读变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch) 的描述。 +如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 设置为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。更多信息和使用限制,参见系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 的详细描述。 ### MySQL JDBC 参数 From 56ff04b1482d334d63a54b4b3e219eabe8800b6d Mon Sep 17 00:00:00 2001 From: Lilian Lee Date: Fri, 2 Aug 2024 14:45:25 +0800 Subject: [PATCH 11/12] Update format for consistency --- develop/dev-guide-connection-parameters.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/develop/dev-guide-connection-parameters.md b/develop/dev-guide-connection-parameters.md index 435f031ab828..713f208ab4f3 100644 --- a/develop/dev-guide-connection-parameters.md +++ b/develop/dev-guide-connection-parameters.md @@ -136,7 +136,7 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 - 方式一:设置 [**FetchSize** 为 `Integer.MIN_VALUE`](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-implementation-notes.html#ResultSet) 让客户端不缓存,客户端通过 StreamingResult 的方式从网络连接上流式读取执行结果。 - 方式二:使用 Cursor Fetch,首先需[设置 **FetchSize**](http://makejavafaster.blogspot.com/2015/06/jdbc-fetch-size-performance.html) 为正整数,且在 JDBC URL 中配置 `useCursorFetch = true`。 -TiDB 同时支持以上两种方式,但更推荐使用第一种将 **FetchSize** 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 +TiDB 同时支持以上两种方式,但更推荐使用第一种将 `FetchSize` 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会将数据存储到临时磁盘中。 From dbe0fa996a240052e8d9d257febce09de0f32bdd Mon Sep 17 00:00:00 2001 From: Yang Keao Date: Mon, 5 Aug 2024 14:25:07 +0800 Subject: [PATCH 12/12] modify the description of spill disk Signed-off-by: Yang Keao --- best-practices/java-app-best-practices.md | 2 +- develop/dev-guide-connection-parameters.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/best-practices/java-app-best-practices.md b/best-practices/java-app-best-practices.md index 0905434d47ed..689d5ca79ae5 100644 --- a/best-practices/java-app-best-practices.md +++ b/best-practices/java-app-best-practices.md @@ -66,7 +66,7 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 TiDB 同时支持以上两种方式,但更推荐使用第一种将 `FetchSize` 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 -对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会将数据存储到临时磁盘中。 +对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会触发落盘临时将结果写入硬盘。 如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 设置为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。更多信息和使用限制,参见系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 的详细描述。 diff --git a/develop/dev-guide-connection-parameters.md b/develop/dev-guide-connection-parameters.md index 713f208ab4f3..5bed4a7c638f 100644 --- a/develop/dev-guide-connection-parameters.md +++ b/develop/dev-guide-connection-parameters.md @@ -138,7 +138,7 @@ Java 应用尽管可以选择在不同的框架中封装,但在最底层一般 TiDB 同时支持以上两种方式,但更推荐使用第一种将 `FetchSize` 设置为 `Integer.MIN_VALUE` 的方式,比第二种功能实现更简单且执行效率更高。 -对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会将数据存储到临时磁盘中。 +对于第二种方式,TiDB 会先将所有数据加载到 TiDB 节点上,然后根据 `FetchSize` 依次返回给客户端。因此,通常会比第一种方式使用更多内存。如果将 [`tidb_enable_tmp_storage_on_oom`](/system-variables.md#tidb_enable_tmp_storage_on_oom) 设置为 `ON`,可能会触发落盘临时将结果写入硬盘。 如果系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 设置为 `ON`,TiDB 将尝试仅在客户端请求数据时读取部分数据,以使用更少的内存。更多信息和使用限制,参见系统变量 [`tidb_enable_lazy_cursor_fetch`](/system-variables.md#tidb_enable_lazy_cursor_fetch-从-v830-版本开始引入) 的详细描述。