基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
cardinality_estimation_model
更新时间:2026-04-27 12:15:57
说明
- 在 V4.3.x 版本中,该变量从 V4.3.3 版本开始引入。
- 在 V4.2.x 版本中,该变量从 V4.2.4 版本开始引入。
功能描述
cardinality_estimation_model 用于设置控制优化器在基数估计时使用的相关性假设。
注意
请确保在将此选项引入生产环境之前,先对其进行全面测试。
权限要求
查询变量
Global 级别
sys租户和所有用户租户均可以使用SHOW VARIABLES语句或视图SYS.TENANT_VIRTUAL_GLOBAL_VARIABLE(Oracle 模式)及视图information_schema.GLOBAL_VARIABLES(MySQL 模式)查看 Global 系统变量的值。Session 级别
sys租户和所有用户租户均可以使用SHOW VARIABLES语句或视图SYS.TENANT_VIRTUAL_SESSION_VARIABLE(Oracle 模式)及视图information_schema.SESSION_VARIABLES(MySQL 模式)查看 Session 系统变量的值。
修改变量
Global 生效
sys租户可以直接修改 Global 系统变量的值。MySQL 用户租户需要拥有
SUPER或ALTER SYSTEM权限才能修改 Global 系统变量的值。对于 V4.x 版本,从 V4.2.0 版本开始,Oracle 用户租户需要拥有
ALTER SYSTEM权限才能修改 Global 系统变量的值。
Session 生效
sys租户和所有用户租户均可以直接修改本租户的 Session 系统变量的值。
属性说明
| 属性 | 描述 |
|---|---|
| 参数类型 | Enum |
| 默认值 | PARTIAL |
| 取值范围 |
说明在大多数场景下,三种相关性的估行结果会依次变大:INDEPENDENT < PARTIAL < FULL。 |
| 生效范围 |
|
| 是否可修改 | 是,支持通过 SET 语句修改。 |
配置示例
在三种相关性假设下,对 t1 经过基表谓词过滤后的结果,估行结果分别为 10, 31, 98。
创建表
t1。obclient [test]> create table t1(c1 int, c2 int); Query OK, 0 rows affected (0.103 sec)插入数据到表
t1。obclient [test]> insert into t1 select row_number() over () % 10, row_number() over () % 100 from table(generator(10000)); Query OK, 10000 rows affected (0.077 sec) Records: 10000 Duplicates: 0 Warnings: 0分析表
t1。obclient [test]> analyze table t1; Query OK, 0 rows affected (0.073 sec)设置相关性假设为
INDEPENDENT,执行基数估计。obclient [test]> set cardinality_estimation_model = 'independent'; Query OK, 0 rows affected (0.001 sec)查询基数估计结果。
obclient [test]> explain select * from t1 where c1 = 1 and c2 = 1;查询结果如下:
+------------------------------------------------------------------------------------------+ | Query Plan | +------------------------------------------------------------------------------------------+ | =============================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ----------------------------------------------- | | |0 |TABLE FULL SCAN|t1 |10 |734 | | | =============================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1], [t1.c1 = 1]), rowset=16 | | access([t1.c1], [t1.c2]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false,false], | | range_key([t1.__pk_increment]), range(MIN ; MAX)always true | +------------------------------------------------------------------------------------------+ 11 rows in set (0.011 sec)设置相关性假设为
PARTIAL,执行基数估计。obclient [test]> set cardinality_estimation_model = 'partial'; Query OK, 0 rows affected (0.001 sec)查询基数估计结果。
obclient [test]> explain select * from t1 where c1 = 1 and c2 = 1;查询结果如下:
+------------------------------------------------------------------------------------------+ | Query Plan | +------------------------------------------------------------------------------------------+ | =============================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ----------------------------------------------- | | |0 |TABLE FULL SCAN|t1 |31 |735 | | | =============================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1], [t1.c1 = 1]), rowset=256 | | access([t1.c1], [t1.c2]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false,false], | | range_key([t1.__pk_increment]), range(MIN ; MAX)always true | +------------------------------------------------------------------------------------------+ 11 rows in set (0.004 sec)设置相关性假设为
FULL,执行基数估计。obclient [test]> set cardinality_estimation_model = 'full'; Query OK, 0 rows affected (0.000 sec)查询基数估计结果。
obclient [test]> explain select * from t1 where c1 = 1 and c2 = 1;查询结果如下:
+------------------------------------------------------------------------------------------+ | Query Plan | +------------------------------------------------------------------------------------------+ | =============================================== | | |ID|OPERATOR |NAME|EST.ROWS|EST.TIME(us)| | | ----------------------------------------------- | | |0 |TABLE FULL SCAN|t1 |98 |738 | | | =============================================== | | Outputs & filters: | | ------------------------------------- | | 0 - output([t1.c1], [t1.c2]), filter([t1.c2 = 1], [t1.c1 = 1]), rowset=256 | | access([t1.c1], [t1.c2]), partitions(p0) | | is_index_back=false, is_global_index=false, filter_before_indexback[false,false], | | range_key([t1.__pk_increment]), range(MIN ; MAX)always true | +------------------------------------------------------------------------------------------+ 11 rows in set (0.003 sec)