跳到主要内容

SET_VAR

SET_VAR 用于在单个 SQL 语句中指定优化器提示,从而实现对该特定语句执行计划的更精细控制。这包括:

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

  • 通过标签 deduplicate_label 控制 INSERTUPDATEREPLACE 操作的去重行为。对于在 SQL 语句中带有 deduplicate_label 的这些操作,Databend 仅执行第一个语句,后续具有相同 deduplicate_label 值的语句将被忽略,无论其预期的数据修改如何。请注意,一旦设置了 deduplicate_label,它将在 24 小时内保持有效。要了解 deduplicate_label 如何协助去重,请参阅 示例 3:设置 Deduplicate Label

另请参阅:SET

语法

/*+ SET_VAR(key=value) SET_VAR(key=value) ... */
  • 提示必须紧跟在 SELECTINSERTUPDATEREPLACEMERGEDELETECOPY (INTO) 关键字之后,这些关键字开始 SQL 语句。
  • 一个 SET_VAR 只能包含一个键值对,这意味着您只能使用一个 SET_VAR 配置一个设置。但是,您可以使用多个 SET_VAR 提示来配置多个设置。
    • 如果多个 SET_VAR 提示包含相同的键,将应用第一个键值对。
    • 如果键解析或绑定失败,所有提示将被忽略。

示例

示例 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 的并行处理

在 Databend 中,max_threads 设置指定可以用于执行请求的最大线程数。默认情况下,此值通常设置为与机器上的 CPU 核心数相匹配。

当使用 COPY INTO 将数据加载到 Databend 时,您可以通过在 COPY INTO 命令中注入提示并设置 max_threads 参数来控制并行处理能力。例如:

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

示例 3:设置 Deduplicate Label

CREATE TABLE t1(a Int, b bool);
INSERT /*+ SET_VAR(deduplicate_label='databend') */ INTO t1 (a, b) VALUES(1, false);
SELECT * FROM t1;

a|b|
-+-+
1|0|

UPDATE /*+ SET_VAR(deduplicate_label='databend') */ t1 SET a = 20 WHERE b = false;
SELECT * FROM t1;

a|b|
-+-+
1|0|

REPLACE /*+ SET_VAR(deduplicate_label='databend') */ INTO t1 on(a,b) VALUES(40, false);
SELECT * FROM t1;

a|b|
-+-+
1|0|

MERGE /*+ SET_VAR(deduplicate_label='databend') */ INTO t1 using t2 on t1.a = t2.a when matched then update *;
SELECT * FROM t1;

a|b|
-+-+
1|0|