📣
TiDB Cloud Premium 开放公测中。为企业级工作负载提供无限扩展、即时弹性伸缩和高级安全保障。此页面由 AI 自动翻译,英文原文请见此处。

SET_VAR



SET_VAR 用于在单条 SQL 语句中指定优化器 hint,从而对该语句的执行计划进行更细粒度的控制。这包括:

  • 临时配置设置,仅在 SQL 语句执行期间生效。需要注意的是,使用 SET_VAR 指定的设置只会影响当前正在执行语句的结果,不会对整体数据库配置产生任何持久影响。有关可通过 SET_VAR 配置的可用设置列表,请参阅 SHOW SETTINGS。如需了解其工作方式,请参阅以下示例:

  • 使用标签 deduplicate_label 控制 INSERT、UPDATE 或 REPLACE 操作的去重行为。对于 SQL 语句中带有 deduplicate_label 的这些操作,TiDB Cloud Lake 只执行第一条语句,后续具有相同 deduplicate_label 值的语句都会被忽略,无论这些语句原本打算进行何种数据修改。请注意,一旦设置了 deduplicate_label,它将在 24 小时内持续生效。要了解 deduplicate_label 如何帮助去重,请参阅 示例 3:设置去重标签。

另请参阅:

语法

/*+ SET_VAR(key=value) SET_VAR(key=value) ... */
  • 该 hint 必须紧跟在作为 SQL 语句开头的 SELECT、INSERT、UPDATE、REPLACE、MERGE、DELETE 或 COPY (INTO) 关键字之后。
  • 一个 SET_VAR 只能包含一个 Key=Value 对,这意味着你只能通过一个 SET_VAR 配置一个设置。不过,你可以使用多个 SET_VAR hint 来配置多个设置。
    • 如果多个 SET_VAR hint 包含相同的 key,则第一个 Key=Value 对会生效。
    • 如果某个 key 解析或绑定失败,则所有 hint 都会被忽略。

示例

示例 1:临时设置时区

root@localhost> SELECT TIMEZONE(); SELECT TIMEZONE(); ┌────────────┐ │ timezone() │ │ String │ ├────────────┤ │ UTC │ └────────────┘ 1 row in 0.011 sec. Processed 1 rows, 1B (91.23 rows/s, 91B/s) root@localhost> SELECT /*+SET_VAR(timezone='America/Toronto') */ TIMEZONE(); SELECT /*+SET_VAR(timezone='America/Toronto') */ TIMEZONE(); ┌─────────────────┐ │ timezone() │ │ String │ ├─────────────────┤ │ America/Toronto │ └─────────────────┘ 1 row in 0.023 sec. Processed 1 rows, 1B (43.99 rows/s, 43B/s) root@localhost> SELECT TIMEZONE(); SELECT TIMEZONE(); ┌────────────┐ │ timezone() │ │ String │ ├────────────┤ │ UTC │ └────────────┘ 1 row in 0.010 sec. Processed 1 rows, 1B (104.34 rows/s, 104B/s)

示例 2:控制 COPY INTO 的并行处理

在 TiDB Cloud Lake 中,max_threads 设置指定了可用于执行请求的最大线程数。默认情况下,该值通常设置为与机器上可用的 CPU 核心数一致。

使用 COPY INTO 将数据加载到 TiDB Cloud Lake 时,你可以通过在 COPY INTO 命令中注入 hint 并设置 max_threads 参数来控制并行处理能力。例如:

COPY /*+ set_var(max_threads=6) */ INTO mytable FROM @mystage/ pattern='.*[.]parq' FILE_FORMAT=(TYPE=parquet);

示例 3:设置去重标签

CREATE TABLE t1(a Int, b bool); INSERT /*+ SET_VAR(deduplicate_label='datalake') */ INTO t1 (a, b) VALUES(1, false); SELECT * FROM t1; a|b| -+-+ 1|0| UPDATE /*+ SET_VAR(deduplicate_label='datalake') */ t1 SET a = 20 WHERE b = false; SELECT * FROM t1; a|b| -+-+ 1|0| REPLACE /*+ SET_VAR(deduplicate_label='datalake') */ INTO t1 on(a,b) VALUES(40, false); SELECT * FROM t1; a|b| -+-+ 1|0| MERGE /*+ SET_VAR(deduplicate_label='datalake') */ INTO t1 using t2 on t1.a = t2.a when matched then update *; SELECT * FROM t1; a|b| -+-+ 1|0|

文档内容是否有帮助?