变量管理

本文介绍云数据库 SelectDB 版提供的变量管理功能和使用方法,并对时区变量进行详细介绍,帮助您更好的使用云数据库 SelectDB 版的变量以支撑业务需求。

变量

变量分为两部分:一部分为云数据库 SelectDB 版特有变量,另一部分为兼容MySQL客户端协议的变量。具体变量列表可参考本文附录

查看与设置变量

查看

可以通过SHOW VARIABLES [LIKE 'xxx'];查看所有变量或指定的变量。

SHOW VARIABLES;
SHOW VARIABLES LIKE '%time_zone%';

设置

变量可设置为全局生效即设置全局变量(global variable),也可设置为当前会话生效即设置会话变量(session variable)。

会话变量设置:如果期望仅当前会话生效,可通过SET var_name=xxx;语句来设置,示例如下。

SET exec_mem_limit = 137438953472;
SET forward_to_master = true;
SET time_zone = "Asia/Shanghai";

全局变量设置:如果期望全局生效,通过SET GLOBAL var_name=xxx;设置。设置全局变量生效后,后续新的会话连接中会沿用设置值,当前会话中的值也会改变,示例如下。

SET GLOBAL exec_mem_limit = 137438953472
重要

只有ADMIN用户可以设置变量全局生效。

既支持当前会话生效又支持全局生效的变量如下。

  • time_zone

  • wait_timeout

  • sql_mode

  • enable_profile

  • query_timeout

  • insert_timeout

  • exec_mem_limit

  • batch_size

  • allow_partition_column_nullable

  • insert_visible_timeout_ms

  • enable_fold_constant_by_be

只支持全局生效的变量如下。

  • default_rowset_type

  • default_password_lifetime

  • password_history

  • validate_password_policy

同时,变量设置也支持常量表达式,示例如下。

SET exec_mem_limit = 10 * 1024 * 1024 * 1024;
SET forward_to_master = concat('tr', 'u', 'e');

查询语句中设置变量

在一些场景中,可能需要对某些查询针对性设置变量。 通过使用SET_VAR提示可以在查询中设置会话变量(在单个语句内生效),示例如下。

SELECT /*+ SET_VAR(exec_mem_limit = 8589934592) */ name FROM people ORDER BY name;
SELECT /*+ SET_VAR(query_timeout = 1, enable_partition_cache=true) */ sleep(3);
说明

注释必须以/*+ 开头,并且只能跟随在SELECT之后。

时区

时区作为变量中较为关键的一类变量,影响SelectDB内部很多的函数行为和参数值。为支持不同地区不同业务的需求,SelectDB支持自定义时区设置。

SelectDB内部存在以下两个时区相关参数。

  • system_time_zone : 当服务器启动时,会根据机器的时区参数自动设置,设置后不可修改。

  • time_zone : 集群当前时区,可以修改。

具体操作

查看当前时区相关配置,示例如下。

SHOW variables LIKE '%time_zone%'

重新设置Session中的时区,示例如下。

SET [GLOBAL] time_zone = 'Asia/Shanghai'
说明

如使用GLOBAL关键字,则SelectDB会将参数持久化,对之后所有新Session生效。

时区格式

时区值可以使用多种格式,以下是云数据库 SelectDB 版中支持的标准格式。

  • 标准具名时区格式,如"Asia/Shanghai","America/Los_Angeles"。

  • 标准偏移格式,如"+02:30","-10:00"。

  • 缩写时区格式,当前仅支持。

    • "GMT"、"UTC",等同于"+00:00"时区。

    • "CST"等同于"Asia/Shanghai"时区。

  • 单字母Z,代表Zulu时区,等同于"+00:00"时区。

说明

由于实现方式的不同,当前SelectDB可能已经在部分导入方式中支持了其他时区格式。生产环境不建议依赖其他时区格式,SelectDB对其他时区格式的处理行为随时可能发生变化。

时区影响

函数

不同时区将影响包括NOW()CURTIME()等时间函数显示的值,也包括SHOW load,SHOW backends中的时间值,但不会影响CREATE TABLE中时间类型分区列的less than值,也不会影响存储为date/datetime类型值的显示。

受时区影响的函数如下。

  • FROM_UNIXTIME:指定一个UTC时间戳,返回指定时区的日期时间。例如FROM_UNIXTIME(0),返回CST时区为1970-01-01 08:00:00

  • UNIX_TIMESTAMP:指定一个指定时区日期时间,返回UTC时间戳。例如CST时区下,UNIX_TIMESTAMP('1970-01-01 08:00:00'),返回0

  • CURTIME:返回指定时区时间。

  • NOW:返回指定时区日期和时间。

  • CONVERT_TZ:将一个日期时间从一个指定时区转换到另一个指定时区。

时间类型的值

在插入数据类型为DATEDATEV2DATETIMEDATETIMEV2的数据时,SelectDB支持对时区进行转换。

例如数据带有时区,如"2020-12-12 12:12:12+08:00",而当前SelectDBtime_zone = +00:00,则得到实际值为"2020-12-12 04:12:12"。

例如数据不带有时区,如"2020-12-12 12:12:12",则认为该时间为绝对时间,不发生任何转换。

夏令时

夏令时的本质是具体命名时区的实际时间偏移量,在一定日期内发生改变。

例如,America/Los_Angeles时区包含一次夏令时调整,起止时间为约为每年3月至11月。即,三月份夏令时开始时,America/Los_Angeles实际时区偏移由-08:00变为-07:00,11月夏令时结束时,又从-07:00变为-08:00

如果不希望开启夏令时,则应设定time_zone-08:00而非America/Los_Angeles

数据来源

时区数据包含时区名、对应时间偏移量、夏令时变化情况等。在BE所在机器上,其数据来源依次为:

  1. TZDIR命令返回的目录。

  2. /usr/share/zoneinfo目录。

  3. SelectDB BE部署目录下生成的zoneinfo目录。

SelectDB按顺序查找以上数据源,如果找到对应时区数据则使用,若在上述三个来源中均未找到,则SelectDB BE将启动失败。

最佳实践

时区敏感数据

SelectDB目前兼容各时区下的数据导入SelectDB。时区问题主要涉及三个影响因素:

  • Session变量(time_zone):集群时区。

  • Stream Load、Broker Load等导入时指定的Header中(timezone): 导入时区。

  • 时区类型字面量"2023-12-12 08:00:00+08:00"中的"+08:00": 数据时区。

由于DATETIME等各个时间类型本身不包含额外的时区信息,因此SelectDB集群内的时间类型数据,可以分为两类:绝对时间和特定时区下的时间。

  • 绝对时间:时间格式上不包含额外的时区信息,且在导入时没有指定时区。例如"2023-12-12 08:00:00"。它所关联的数据场景与时区无关。这类数据在导入时不带有任何时区信息,在导入的时候不会受到任何时区设置的影响。因为这类时间不关联到实际的时区,取其unix_timestamp等函数结果是无实际意义的,集群time_zone的改变也不会影响它的使用。

  • 特定时区下的时间:时间数据中本身带有时区信息,在导入时会受到时区设置的影响。例如"2020-12-12 12:12:12+02:00"。此类时间数据在导入时会根据设置的时区信息进行处理。

    • 对于 INSERT INTO 操作,时间数据受Session变量(time_zone)设置影响。

    • 对于 Stream Load 操作,时间数据受Stream Load的Header中(timezone)设置的影响。与Session变量(time_zone)中的设置不同的场合,以Header中(timezone)设置为准。

    此处的“特定时区”,指的是集群中设定的Session变量(time_zone)。该变量应当在数据导入前确定,且不再更改。此时SelectDB集群中的该类时间数据,其实际意义为:时区类型字面量的数据时区下描述的时间值,在time_zone时区下对应的时间。

特定时区下的时间和最佳实践中不建议修改Session变量(time_zone),示例如下。

mysql> SELECT@@time_zone;
+----------------+
| @@time_zone    |
+----------------+
| Asia/Hong_Kong |
+----------------+
1 row in set (0.12 sec)
--- 绝对时区为+02:00
mysql> INSERT INTO dtv23 VALUES('2020-12-12 12:12:12+02:00'); 
Query OK, 1 row affected (0.27 sec)

mysql> SELECT* FROM dtv23;
--- 被转换为 Doris 集群时区 Asia/Hong_Kong,应当保持此语义
+-------------------------+
| k0                      |
+-------------------------+
| 2020-12-12 18:12:12.000 | 。
+-------------------------+
1 row in set (0.19 sec)

mysql> SET time_zone = 'America/Los_Angeles';
Query OK, 0 rows affected (0.15 sec)

mysql> SELECT* FROM dtv23;
--- 如果修改 time_zone,时间值不会随之改变,其意义发生紊乱。
+-------------------------+
| k0                      |
+-------------------------+
| 2020-12-12 18:12:12.000 | 
+-------------------------+
1 row in set (0.18 sec)

mysql> insert into dtv23 values('2020-12-12 12:12:12+02:00');
Query OK, 1 row affected (0.17 sec)

mysql> SELECT* FROM dtv23;
--- 此时可以发现,数据已经发生错乱。
+-------------------------+
| k0                      |
+-------------------------+
| 2020-12-12 02:12:12.000 |
| 2020-12-12 18:12:12.000 |
+-------------------------+ 
2 rows in set (0.19 sec)

综上所述,处理时区问题最佳的实践如下。

  • 在使用前确认该集群所表征的时区并设置time_zone,在此之后不再更改。

  • 在导入时设定Headertimezone同集群time_zone一致。

  • 对于绝对时间,导入时不带时区后缀;对于有时区的时间,导入时带具体时区后缀,导入后将被转化至 SelectDBtime_zone时区。

夏令时

夏令时的起讫时间来自于当前时区数据源,不一定与当年度时区所在地官方实际确认时间完全一致。该数据由ICANN进行维护。如果需要确保夏令时表现与当年度实际规定一致,请保证SelectDB所选择的数据源为最新的 ICANN 所公布时区数据。下载途径,详情请参见扩展阅读

附录

支持的变量

开关类参数

这类参数一般只有true和false两个参数取值,与某类功能或特性的启用与否有关。

参数名称

参数说明

delete_without_partition

在执行DELETE命令删除分区表数据时,即使不指定特定的分区,该DELETE操作仍将自动应用于所有分区。默认为false。

重要

自动应用到所有分区可能导致DELETE命令的执行时间增加,并触发大量子任务,从而导致整体执行时间增长。建议不要开启此功能。

disable_colocate_join

是否禁用Colocation Join功能,默认为false。

表示启用该功能。true表示禁用该功能。当该功能被禁用后,查询规划将不会尝试执行Colocation Join。

enable_bucket_shuffle_join

是否启用Bucket Shuffle Join功能,默认为true。

表示启用该功能。false表示禁用该功能。当该功能被禁用后,查询规划将不会尝试执行Bucket Shuffle Join。

disable_streaming_preaggregations

是否禁用流式预聚合,默认为false。

即开启。当前不可修改。

enable_insert_strict

通过INSERT语句进行数据导入时,是否开启strict模式,默认为false。

即不开启strict模式。

enable_spilling

是否开启大数据量落盘排序,默认为false。

即关闭该功能。当用户未指定ORDER BY子句的LIMIT条件,同时设置enable_spilling为true时,才会开启落盘排序。

该功能启用后,会使用BE数据目录下doris-scratch/目录存放临时的落盘数据,并在查询结束后,清空临时数据。

该功能主要用于使用有限的内存进行大数据量的排序操作。

重要

该功能为实验性质,生产环境下不建议使用。

forward_to_master

是否将一些展示类命令转发到Master FE节点执行,默认为true

即转发,SelectDB实例中存在多个FE节点,其中一个为Master节点。通常用户可以连接任意 FE节点进行全功能操作。但部分信息查看指令,只有从Master FE节点才能获取详细信息。例如SHOW BACKENDS;命令,如果不转发到Master FE节点,则仅能看到节点是否存活等一些基本信息,而转发到Master FE则可以获取包括节点启动时间、最后一次心跳时间等更详细的信息。

当前受该参数影响的命令如下:

  • SHOW FRONTENDS;

    转发到Master可以查看最后一次心跳信息。

  • SHOW BACKENDS;

    转发到Master可以查看启动时间、最后一次心跳信息、磁盘容量信息。

  • SHOW BROKER;

    转发到Master可以查看启动时间、最后一次心跳信息。

  • SHOW TABLET;SHOW REPLICA DISTRIBUTION;SHOW REPLICA STATUS;

    转发到Master可以查看Master FE元数据中存储的Tablet信息。正常情况下,不同FE元数据中Tablet信息应该是一致的。当出现问题时,可以通过这个方法比较当前FE和Master FE元数据的差异。

  • SHOW PROC;

    转发到Master可以查看Master FE元数据中存储的相关PROC的信息。主要用于元数据比对。

enable_profile

是否需要查看查询的Profile,默认为 false。

即不需要Profile。默认情况下,只有在查询发生错误时,BE才会发送Profile给 FE,用于查看错误。考虑到发送Profile会产生一定的网络开销,对高并发查询场景不利,正常结束的查询不会发送Profile。

当用户希望对一个查询的Profile进行分析时,可以在将这个变量设为true后发送查询。查询结束后,可以通过在当前连接的FE的Web页面查看到Profile:

fe_host:fe_http_port/query

其中会显示最近100条开启enable_profile的查询的Profile。

rewrite_count_distinct_to_bitmap_hll

是否将Bitmap和HLL类型的count distinct查询重写为bitmap_union_counthll_union_agg,默认为true。

allow_partition_column_nullable

建表时是否允许分区列为NULL,默认为true。

表示允许为NULL。false表示分区列必须被定义为NOT NULL。

enable_exchange_node_parallel_merge

Exchange node是否采取并行的归并排序,来减少额外的CPU和内存消耗。默认为false。

在一个排序的查询之中,一个上层节点接收下层节点有序数据时,会在Exchange node上进行对应的排序来保证最终的数据是有序的。但是单线程进行多路数据归并时,如果数据量过大,会导致Exchange node出现单点归并瓶颈。

SelectDB在这部分进行了优化处理,如果下层的数据节点过多,Exchange node会启动多线程进行并行归并来加速排序过程。

extract_wide_range_expr

是否开启「宽泛公因式提取」的优化,默认为false。

enable_fold_constant_by_be

用于控制常量折叠的计算方式,默认为false。

即在FE进行计算;若设置为true,则通过RPC请求经BE计算。

disable_join_reorder

用于关闭所有系统自动的Join reorder算法。默认为false。

即表示采用系统自动的Join reorder算法。设置为true后,系统会关闭所有自动排序的算法,采用SQL原始的表顺序执行Join。

enable_infer_predicate

是否进行谓词推导,默认为true。

即进行谓词扩展。关闭后,SelectDB不再进行谓词推导,而是采用原始的谓词进行相关操作。

trim_tailing_spaces_for_external_table_query

用于控制查询Hive外表时是否过滤掉字段末尾的空格,默认为false。

enable_inverted_index_query

是否启用倒排索引,默认true。

skip_missing_version

是否忽略错误版本,默认为false。

在某些极端场景中,表的Tablet下所有副本都有版本缺失,使得这些Tablet没有办法被恢复,导致整张表都不能查询。

这个变量可以用来控制查询的行为,当设置为true时,查询会忽略FE Partition中记录的visibleVersion,转而使用replica version。如果BE上的Replica有缺失的版本,则查询会直接跳过这些缺失的版本,只返回仍存在版本的数据。

此外,查询将会总是选择所有存活的BE中所有Replica里LastSuccessVersion最大的那一个,这样可以尽可能的恢复更多的数据。

这个变量应该只在上述紧急情况下才被设置为true,仅用于临时让表恢复查询。

重要

此变量与use_fix_replica变量冲突,当use_fix_replica变量不等于-1时,此变量不起作用。

enable_parquet_lazy_materialization

控制Parquet reader是否启用延迟物化技术,默认为true。

enable_orc_lazy_materialization

控制Orc reader是否启用延迟物化技术,默认为true。

enable_strong_consistency_read

是否开启强一致读,默认为true。

SelectDB默认支持同一个会话内的强一致性,即同一个会话内对数据的变更操作是实时可见的。如需要会话间的强一致读,则需将此变量设置为true。

truncate_char_or_varchar_columns

是否按照表的Schema来截断char或者varchar列,默认为false。

使用外表进行数据管理时,表的Schema中char或者varchar列的最大长度和底层Parquet或者ORC文件中的Schema可能存在不一致的情况。

开启该选项,会按照表的Schema中的最大长度进行截断。

jdbc_clickhouse_query_final

是否在使用JDBC Catalog功能查询ClickHouse时增加final关键字,默认为false。

该选项将用于ClickHouse的ReplacingMergeTree表引擎查询去重。

enable_memtable_on_sink_node

是否在数据导入中启用MemTable前移,默认为false。

当启用时,SelectDB会在DataSink节点上构建MemTable,并通过BRPC Streaming发送Segment到其他BE。该方法减少了多副本之间的重复工作,并且节省了数据序列化和反序列化的时间。

enable_unique_key_partial_update

是否对INSERT INTO语句启用部分列更新的语义,默认为false。

需要注意的是,控制INSERT语句是否开启严格模式的会话变量enable_insert_strict的默认值为true,即INSERT语句默认开启严格模式,而在严格模式下进行部分列更新不允许更新不存在的Key。

所以,在使用Insert语句进行部分列更新的时候,如果希望能插入不存在的Key,需要在enable_unique_key_partial_update设置为true的同时,将enable_insert_strict设置为false。

describe_extend_variant_column

是否展示Variant的拆解列。默认为false。

dry_run_query

是否开启仅返回行数,默认为false。

如果设置为true,对于查询请求,将不再返回实际结果集,而仅返回行数。对于导入和Insert操作,Sink将丢掉数据,不会有实际的写发生。

该参数可以用于测试返回大量数据集时,规避结果集传输的耗时,重点关注底层查询执行的耗时。

SELECT* FROM bigtable;
+--------------+
| ReturnedRows |
+--------------+
| 10000000     |
+--------------+

drop_table_if_ctas_failed

控制create table as select在写入发生错误时是否删除已创建的表,默认为true。

show_user_default_role

控制是否在show roles的结果里显示每个用户隐式对应的角色,默认为 false。

group_by_and_having_use_alias_first

指定group byhaving语句是否优先使用列的别名,而非从From语句里寻找列的名字,默认为false。

enable_file_cache

是否启用Block file cache,默认false。

该变量只有在be.conf中enable_file_cache=true时才有效,如果be.conf中enable_file_cache=false,该BE节点的Block file cache处于禁用状态。

enable_auto_analyze

是否开启自动收集功能,默认为true。

enable_cost_based_join_reorder

控制是否开启Join Reorder,以自动调节Join时的表顺序。

默认为false。

enable_fallback_to_original_planner

控制在启用新优化器后是否根据场景自动回退到旧优化器,默认为false。

enable_odbc_transcation

是否启用JDBC Catalog的数据写入时事务,默认为false。

enable_parallel_outfile

是否启用OUTFILE指令中的并发导出,默认为false。

enable_sql_cache

控制SQL是否使用 cache,默认为false。

enable_unicode_name_support

是否启用unicode字符的表/列名支持,默认为false。

设置为true可支持中文列名。

enable_vectorized_engine

是否启用向量化引擎以实现加速,默认为true。

experimental_enable_nereids_planner

是否启用新优化器。实验性特性,默认为true。

experimental_enable_pipeline_engine

是否启用pipeline执行引擎。实验性特性,默认为true。

experimental_enable_single_replica_insert

是否启用单副本导入能力,默认为false。

该能力会从多个副本中选择一个副本作为主副本(其他副本为从副本),且只对主副本进行计算,当主副本的数据文件都写入成功后,通知从副本所在节点直接接拉取主副本的数据文件,实现副本间的数据同步。

faster_float_convert

是否启用更快的浮点数转换算法,注意会影响输出格式,默认为false。

enable_page_cache

控制是否启用Page cache,默认为 true。

strict_mode

用户指定导入数据是否开启严格模式,默认为false。

配置类参数

配置类参数的取值与具体参数值有关。

参数名称

参数说明

auto_broadcast_join_threshold

执行Join时将向所有节点广播表的最大字节大小,通过将此值设置为-1可以禁用广播。

SelectDB提供了两种Join的实现方式:broadcast joinshuffle join

broadcast join是指将小表进行条件过滤后,将其广播到大表所在的各个节点上,形成一个内存Hash表,然后流式读出大表的数据进行Hash Join。

shuffle join是指将小表和大表都按照Join的Key进行 Hash,然后进行分布式的Join。

当小表的数据量较小时,broadcast join拥有更好的性能。反之,shuffle join拥有更好的性能。

系统会自动尝试进行Broadcast Join,也可以显式指定每个Join算子的实现方式。系统提供了可配置的参数auto_broadcast_join_threshold,指定使用broadcast join时,HashTable使用的内存占整体执行内存比例的上限,取值范围为0到1,默认为0.8。当系统计算HashTable使用的内存会超过此限制时,会自动转换为使用shuffle join。这里的整体执行内存由查询优化器进行估算。

说明

不建议用该参数来调整Join,如果必须要使用某一种Join,建议使用Hint,例如 join[shuffle]。

batch_size

用于指定在查询执行过程中,各个节点传输的单个数据包的行数。

默认一个数据包的行数为1024行,即源端节点每产生1024行数据,就打包发送到目的节点。调整为较大的行数,会在扫描大数据量场景下提升查询的吞吐,但可能会在小查询场景下增加查询延迟,同时也会增加查询的内存开销。

建议设置范围为1024至4096。

default_order_by_limit

指定ORDER BY返回的默认条数。

默认为-1,默认返回查询后的最大条数,上限为long数据类型的MAX_VALUE值。

exec_mem_limit

指定单个查询的内存限制。默认为2 GB。允许设置单位为B(Byte)/KB/MB/GB/TB/PB,不设置单位的场合默认以B(Byte)计算。

该参数用于限制一个查询计划中,单个查询计划的实例所能使用的内存。一个查询计划可能有多个查询单元,一个BE节点可能执行一个或多个查询单元,所以该参数并不能准确限制一个查询在整个集群的内存使用,也不能准确限制一个查询在单一BE节点上的内存使用。具体需要根据生成的查询计划判断。

通常只有在一些阻塞节点(如排序节点、聚合节点、Join节点)上才会消耗较多的内存,而其他节点(如扫描节点)中,数据为流式通过,并不会占用较多的内存。

当出现Memory Exceed Limit错误时,可以尝试指数级增加该参数,如4 GB、8 GB、16 GB等。需要注意的是,这个配置在实际应用时可能有数MB的浮动。

lower_case_table_names

用于控制用户表表名大小写是否敏感。

  • 0:表名大小写敏感。默认为0。

  • 1:表名大小写不敏感,SelectDB在存储和查询时会将表名转换为小写。 优点是在一条语句中可以使用表名的任意大小写形式,下面的SQL是正确的:

    SHOW tables;  
    +------------------+
    | Tables_in_testdb |
    +------------------+
    | cost             |
    +------------------+
    
    SELECT* FROM COST WHERE COst.id < 100 ORDER BY cost.id;

    缺点是建表后无法获得建表语句中指定的表名,show tables查看的表名为指定表名的小写。

  • 2:表名大小写不敏感,SelectDB存储建表语句中指定的表名,查询时转换为小写进行比较。 优点是show tables查看的表名为建表语句中指定的表名,缺点是同一语句中只能使用表名的一种大小写形式,例如对cost表使用表名COST进行查询:

    SELECT* FROM COST WHERE COST.id < 100 ORDER BY COST.id;

    该变量兼容MySQL。需在集群初始化时通过fe.conf指定lower_case_table_names进行配置,集群初始化完成后无法通过set语句修改该变量,也无法通过重启、升级集群修改该变量。

    information_schema中的系统视图表名不区分大小写,当lower_case_table_names值为0时,表现为2。

max_pushdown_conditions_per_column

该变量的具体含义请参阅BE配置项中max_pushdown_conditions_per_column的说明。该变量默认为-1,表示使用be.conf中的配置值。如果设置大于0,则当前会话中的查询会使用该变量值,而忽略be.conf中的配置值。

max_scan_key_num

该变量的具体含义请参阅BE配置项中doris_max_scan_key_num的说明。该变量默认为 -1,表示使用be.conf中的配置值。如果设置大于0,则当前会话中的查询会使用该变量值,而忽略be.conf中的配置值。

parallel_exchange_instance_num

用于设置执行计划中,一个上层节点接收下层节点数据所使用的Exchange node 数量。默认为-1,即表示Exchange node 数量等于下层节点执行实例的个数(默认行为)。

当设置为大于0,并且小于下层节点执行实例的个数时,则Exchange node数量等于设置值。

在一个分布式的查询执行计划中,上层节点通常有一个或多个Exchange node用于接收来自下层节点在不同BE上的执行实例的数据。通常Exchange node数量等于下层节点执行实例数量。

在一些聚合查询场景下,如果底层需要扫描的数据量较大,但聚合之后的数据量很小,则可以尝试修改此变量为一个较小的值,可以降低此类查询的资源开销。如在DUPLICATE KEY明细模型上进行聚合查询的场景。

analyze_timeout

控制ANALYZE超时时间,单位为秒,默认43200秒。

auto_analyze_end_time

自动统计信息收集结束时间。

auto_analyze_start_time

自动统计信息收集开始时间。

auto_analyze_table_width_threshold

控制自动统计信息收集处理的最大表宽度,列数大于该值的表不会参与自动统计信息收集。默认为70。

div_precision_increment

此变量表示增加与/运算符执行的除法操作结果规模的位数。默认为4。

external_agg_bytes_threshold

查询中的聚合操作允许使用的内存。超过该值则会将内存数据临时写入磁盘。

external_sort_bytes_threshold

查询中的排序操作允许使用的内存。超过该值则会将内存数据临时写入磁盘。

external_table_auto_analyze_interval_in_millis

控制对外表的自动ANALYZE的最小时间间隔,在该时间间隔内的外表仅ANALYZE一次。默认为86400000,单位为毫秒。

fragment_transmission_compression_codec

控制使用何种压缩格式进行数据传输。默认为lz4。

huge_table_auto_analyze_interval_in_millis

控制对大表的自动ANALYZE的最小时间间隔,在该时间间隔内大小超过huge_table_lower_bound_size_in_bytes * 5的表仅ANALYZE一次。默认为0。

huge_table_default_sample_rows

对大表的采样行数。默认为4194304。

huge_table_lower_bound_size_in_bytes

大小超过该值的表,在自动收集时将会自动通过采样收集统计信息。默认为0。

ignore_runtime_filter_ids

ignore_runtime_filter_ids列表中的Runtime Filter将不会被生成。

默认为空。

max_filter_ratio

最大容忍可过滤(数据不规范等原因)的数据比例。默认零容忍。

max_instance_num

未设置parallel_pipeline_task_num的场合,SQL查询进行查询并发的Pipeline Task默认最大并发数,默认为64。

parallel_pipeline_task_num

代表了 SQL 查询进行查询并发的 Pipeline Task 数目。默认为0。

此时SelectDB会自动感知每个BE的CPU核数,并把并发度设置为CPU核数的一半且不超过max_instance_num

runtime_filter_type

包括Bloom Filter、MinMax Filter、IN predicate、IN Or Bloom Filter、Bitmap Filter,默认会使用IN Or Bloom Filter,部分情况下同时使用Bloom Filter、MinMax Filter、IN predicate时性能更高。

runtime_filter_mode

用于调整Runtime Filter的下推策略,包括OFF、LOCAL、GLOBAL三种策略,默认设置为GLOBAL策略。

runtime_filter_wait_time_ms

左表的ScanNode等待每个Runtime Filter的时间,默认为1000ms。

runtime_filters_max_num

每个查询可应用的Runtime Filter中Bloom Filter的最大数量,默认为10。

runtime_bloom_filter_min_size

Runtime Filter中Bloom Filter的最小长度,默认为1048576(1M)。

runtime_bloom_filter_max_size

Runtime Filter中Bloom Filter的最大长度,默认为16777216(16M)。

runtime_bloom_filter_size

Runtime Filter中Bloom Filter的默认长度,默认为2097152(2M)。

runtime_filter_max_in_num

如果Join右表数据行数大于这个值,我们将不生成IN predicate,默认为1024。

parallel_fragment_exec_instance_num

针对扫描节点,设置其在每个BE节点上执行单元的个数。默认为1。

一个查询计划通常会产生一组Scan range,即需要扫描的数据范围。这些数据分布在多个BE节点上。一个BE节点会有一个或多个Scan range。默认情况下,每个BE节点的一组Scan range只由一个执行单元处理。当机器资源比较充裕时,可以通过修改该变量,让更多的执行单元同时处理一组Scan range,从而提升查询效率。

Scan实例的数量决定了上层其他执行节点,如聚合节点和Join节点的数量。因此相当于增加了整个查询计划执行的并发度。修改该参数会对大查询效率提升有帮助,但较大数值会消耗更多的机器资源,如CPU、内存、磁盘IO。

query_timeout

用于设置查询超时。

该变量会作用于当前连接中所有的查询语句,对于INSERT语句推荐使用insert_timeout。默认为900(15分钟),单位为秒。

insert_timeout

用于设置针对INSERT语句的超时。该变量仅作用于INSERT语句,建议在INSERT行为易持续较长时间的场景下设置。

默认为14400(4小时),单位为秒。

由于旧版本用户会通过延长query_timeout来防止INSERT语句超时insert_timeoutquery_timeout大于自身的情况下将会失效, 以兼容旧版本用户的习惯。

send_batch_parallelism

用于设置执行InsertStmt操作时发送批处理数据的默认并行度,如果并行度的值超过BE配置中的max_send_batch_parallelism_per_job,那么作为协调点的BE将使用max_send_batch_parallelism_per_job的值。

sql_mode

用于指定SQL模式,以适应某些SQL方言。关于SQL模式,可参阅该文档

sql_select_limit

用于设置SELECT语句的默认返回行数,包括INSERT语句的SELECT从句。

默认为不限制。

time_zone

用于设置当前会话的时区。默认值为system_time_zone的值。时区会对某些时间函数的结果产生影响。关于时区的详细内容,可以参阅时区

wait_timeout

用于设置空闲连接的连接时长。当一个空闲连接在该时长内与SelectDB没有任何交互,则SelectDB会主动断开这个链接。

默认为28800(8小时),单位为秒。

default_rowset_type

用于设置计算节点存储引擎默认的存储格式。

当前支持的存储格式包括alpha和beta。默认为beta。

use_v2_rollup

用于控制查询使用Segment v2存储格式的ROLLUP索引获取数据。

该变量用于上线Segment v2的时候进行验证使用。其他情况不建议使用。

prefer_join_method

在选择Join的具体实现方式是Broadcast Join还是Shuffle Join时,如果Broadcast Join的Cost和Shuffle Join的Cost相等时,该配置项决定优先选择哪种Join方式。

目前该变量的可选值为“broadcast”或者“shuffle”。

insert_visible_timeout_ms

执行INSERT语句时,在导入动作(查询和插入)完成后,还需要等待事务提交使数据可见。

此参数控制等待数据可见的超时时间,默认为10000,最小为1000。

cpu_resource_limit

用于限制一个查询的资源开销。这是一个实验性质的功能。

目前的实现是限制一个查询在单个节点上的Scan线程数量。通过限制Scan线程数,使得从底层返回的数据速度变慢,从而限制查询整体的计算资源开销。若设置为2,则一个查询在单节点上最多使用2个Scan线程。

该参数会覆盖parallel_fragment_exec_instance_num。假设parallel_fragment_exec_instance_num设置为4,而该参数设置为2。则单个节点上的4个执行实例会共享最多2个扫描线程。

该参数会被User Property中的cpu_resource_limit配置覆盖。

默认为 -1,即不限制。

return_object_data_as_binary

用于标识是否在SELECT结果中返回Bitmap/HLL结果。

在SELECTINTO OUTFILE语句中,如果导出文件格式为CSV,则会将Bitmap/HLL数据进行Base64编码;如果是Parquet文件格式,则会把数据作为Byte Array存储。

下面将展示Java的例子,更多的示例可查看samples

try (Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:9030/test?user=root");
             Statement stmt = conn.createStatement()
) {
    stmt.execute("set return_object_data_as_binary=true"); // IMPORTANT!!!
    ResultSet rs = stmt.executeQuery("SELECT uids from t_bitmap");
    while(rs.next()){
        byte[] bytes = rs.getBytes(1);
        RoaringBitmap bitmap32 = new RoaringBitmap();
        switch(bytes[0]) {
            case 0: // for empty bitmap
                break;
            case 1: // for only 1 element in bitmap32
                bitmap32.add(ByteBuffer.wrap(bytes,1,bytes.length-1)
                        .order(ByteOrder.LITTLE_ENDIAN)
                        .getInt());
                break;
            case 2: // for more than 1 elements in bitmap32
                bitmap32.deserialize(ByteBuffer.wrap(bytes,1,bytes.length-1));
                break;
            // for more details, see https://github.com/apache/doris/tree/master/samples/read_bitmap
        }
    }
}

block_encryption_mode

用于控制块加密模式,默认值为NULL。

当使用AES算法加密时相当于AES_128_ECB, 当使用SM3算法加密时相当于SM3_128_ECB

可选值:

 AES_128_ECB, AES_192_ECB, AES_256_ECB, AES_128_CBC, AES_192_CBC, AES_256_CBC, AES_128_CFB, AES_192_CFB, AES_256_CFB, AES_128_CFB1, AES_192_CFB1, AES_256_CFB1, AES_128_CFB8, AES_192_CFB8, AES_256_CFB8, AES_128_CFB128, AES_192_CFB128, AES_256_CFB128, AES_128_CTR, AES_192_CTR, AES_256_CTR, AES_128_OFB, AES_192_OFB, AES_256_OFB, SM4_128_ECB, SM4_128_CBC, SM4_128_CFB128, SM4_128_OFB, SM4_128_CTR,

default_password_lifetime

默认的密码过期时间。

默认为0,即表示不过期。单位为天。

该参数只有当用户的密码过期属性为DEFAULT时才生效。如:

CREATE USER user1 IDENTIFIED BY "12345" PASSWORD_EXPIRE DEFAULT;
ALTER USER user1 PASSWORD_EXPIRE DEFAULT;

password_history

默认的历史密码次数。

默认为0,即不做限制。

该参数只有当用户的历史密码次数属性为DEFAULT时,才启用。如:

CREATE USER user1 IDENTIFIED BY "12345" PASSWORD_HISTORY DEFAULT;
ALTER USER user1 PASSWORD_HISTORY DEFAULT;

validate_password_policy

密码强度校验策略。

默认为NONE或0,即不做校验。可以设置为STRONG或2。

当设置为STRONG或2时,通过ALTER USERSET PASSWORD命令设置密码时,密码必须包含“大写字母”,“小写字母”,“数字”和“特殊字符”中的3项,并且长度必须大于等于8。

特殊字符包括:~!@#$%^&*()_+|<>,.?/:;'[]{}"

rewrite_or_to_in_predicate_threshold

默认的改写OR to IN的OR数量阈值。

默认为2,即表示有2个OR的时候,如果可以合并,则会改写成IN。

file_cache_base_path

指定Block file cache在BE上的存储路径,默认为“random”,随机选择BE配置的存储路径。

topn_opt_limit_threshold

设置TopN优化的Limit阈值。默认是1024。

对于语句SELECT * FROM t ORDER BY k LIMIT n,如果Limit的n小于等于阈值,TopN相关优化(动态过滤下推、两阶段获取结果、按Key的顺序读数据)会自动启用,否则会禁用。

use_fix_replica

使用固定Replica进行查询。Replica从0开始,如果use_fix_replica为0,则使用标号最小的Replica,如果use_fix_replica为1,则使用标号第二小的Replica,依此类推。

默认为-1,表示未启用。

兼容性/保留变量

这类参数一般无实际作用。

参数名称

参数说明

SQL_AUTO_IS_NULL

用于兼容 JDBC 连接池 C3P0。无实际作用。

auto_increment_increment

用于兼容MySQL客户端。无实际作用。虽然SelectDB已支持AUTO_INCREMENT功能,但这个参数并不会对AUTO_INCREMENT的行为产生影响。auto_increment_offset也是如此。

autocommit

用于兼容 MySQL 客户端。无实际作用。

character_set_client

用于兼容 MySQL 客户端。无实际作用。

character_set_connection

用于兼容 MySQL 客户端。无实际作用。

character_set_results

用于兼容 MySQL 客户端。无实际作用。

character_set_server

用于兼容 MySQL 客户端。无实际作用。

collation_connection

用于兼容 MySQL 客户端。无实际作用。

collation_database

用于兼容 MySQL 客户端。无实际作用。

collation_server

用于兼容 MySQL 客户端。无实际作用。

have_query_cache

用于兼容 MySQL 客户端。无实际作用。

init_connect

用于兼容 MySQL 客户端。无实际作用。

interactive_timeout

用于兼容 MySQL 客户端。无实际作用。

language

用于兼容 MySQL 客户端。无实际作用。

max_allowed_packet

用于兼容 JDBC 连接池 C3P0。无实际作用。

net_buffer_length

用于兼容 MySQL 客户端。无实际作用。

net_read_timeout

用于兼容 MySQL 客户端。无实际作用。

net_write_timeout

用于兼容 MySQL 客户端。无实际作用。

query_cache_size

用于兼容 MySQL 客户端。无实际作用。

query_cache_type

用于兼容 JDBC 连接池 C3P0。 无实际作用。

sql_safe_updates

用于兼容 MySQL 客户端。无实际作用。

tx_isolation

用于兼容 MySQL 客户端。无实际作用。

tx_read_only

用于兼容 MySQL 客户端。无实际作用。

transaction_read_only

用于兼容 MySQL 客户端。无实际作用。

transaction_isolation

用于兼容 MySQL 客户端。无实际作用。

version

用于兼容 MySQL 客户端。无实际作用。

performance_schema

用于兼容 8.0.16及以上版本的MySQL JDBC。无实际作用。

codegen_level

用于设置 LLVM codegen 的等级,当前未生效。

license

显示 SelectDB 的 License。无其他作用。

resource_group

暂不使用。

system_time_zone

集群初始化时设置为当前系统时区。不可更改。

version_comment

用于显示 SelectDB 的版本。不可更改。

dump_nereids_memo

回归测试用。

group_concat_max_len

为了兼容某些BI工具能正确获取和设置该变量,变量值实际并没有作用。

be_number_for_test

无实际作用。

workload_group

暂未启用。

超时控制补充说明

目前SelectDB支持通过variableuser property两种体系来进行超时控制。其中均包含query_timeoutinsert_timeout

超时生效的优先级次序是:session variable>user property>global variable>default value。较高优先级的变量未设置时,会自动采用下一个优先级的数值。

query_timeout用于控制所有语句的超时,insert_timeout只用于控制INSERT语句的超时,在执行INSERT语句时,超时时间会取query_timeoutinsert_timeout中的最大值。

user property中的query_timeoutinsert_timeout只能由 ADMIN 用户对目标用户予以指定,其语义在于改变被指定用户的默认超时时间,并且不具备quota语义。user property设置的超时时间需要客户端重连后触发。

扩展阅读