全部產品
Search
文件中心

ApsaraDB for SelectDB:變數管理

更新時間:Jan 25, 2025

本文介紹ApsaraDB for SelectDB提供的變數管理功能和使用方法,並對時區變數進行詳細介紹,協助您更好的使用ApsaraDB for SelectDB的變數以支撐業務需求。

變數

變數分為兩部分:一部分為ApsaraDB for 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生效。

時區格式

時區值可以使用多種格式,以下是ApsaraDB for 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(預設):禁用列更新。

true:啟用列更新。

重要
  • 此參數僅在表為Unique模型,且實現方式為寫時合并(MOW,merge-on-write)時有效。

  • 開啟此參數後,如果控制INSERT語句是strict 模式,即enable_insert_strict的值為true(預設值),則INSERT INTO語句僅具備更新功能,不具備插入新資料的功能。如果INSERT INTO語句中包含表內不存在的key,則會報錯。

  • 開啟此參數後,如果您期望在使用INSERT INTO語句進行部分列更新的同時,也能插入新資料,需要在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

使用者指定匯入資料是否開啟strict 模式,預設為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設定的逾時時間需要用戶端重連後觸發。

擴充閱讀