安徽做手机网站,音乐网站开发与需求,新吁网站建设,建设电器网站目的及功能定位统计信息
统计信息简介
Doris 查询优化器使用统计信息来确定查询最有效的执行计划。Doris 维护的统计信息包括表级别的统计信息和列级别的统计信息。
表统计信息#xff1a;
信息描述row_count表的行数data_size表的⼤⼩#xff08;单位 byte#xff09;update_rows收…统计信息
统计信息简介
Doris 查询优化器使用统计信息来确定查询最有效的执行计划。Doris 维护的统计信息包括表级别的统计信息和列级别的统计信息。
表统计信息
信息描述row_count表的行数data_size表的⼤⼩单位 byteupdate_rows收集统计信息后所更新的行数healthy表的健康度update_time最近更新的时间last_analyze_time上次收集统计信息的时间 表的健康度表示表统计信息的健康程度。当 update_rows 大于等于 row_count 时健康度为 0当 update_rows 小于 row_count 时健康度为 100 * (1 - update_rows / row_count) 。 列统计信息
信息描述row_count列的总行数data_size列的总⻓度单位 byteavg_size_byte列的平均⻓度单位 bytesndv列 num distinct valuemin列最小值max列最⼤值null_count列 null 个数
收集统计信息
手动收集
⽤户通过 ANALYZE 语句触发手动收集任务根据提供的参数收集指定的表或列的统计信息。
列统计信息收集语法
ANALYZE TABLE | DATABASE table_name | db_name [ PARTITIONS (partition_name [, ...]) ][ (column_name [, ...]) ][ [ WITH SYNC ] [WITH INCREMENTAL] [ WITH SAMPLE PERCENT | ROWS ] [ WITH PERIOD ] ][ PROPERTIES (key value, ...) ];其中
table_name: 指定的的目标表。可以是 db_name.table_name 形式。partition_name: 指定的目标分区目前只针对Hive外表。必须是 table_name 中存在的分区多个列名称用逗号分隔。分区名样例:event_date20230706, nationCN/cityBeijingcolumn_name: 指定的目标列。必须是 table_name 中存在的列多个列名称用逗号分隔。sync同步收集统计信息。收集完后返回。若不指定则异步执行并返回任务 ID。period周期性收集统计信息。单位为秒指定后会定期收集相应的统计信息。sample percent | rows抽样收集统计信息。可以指定抽样比例或者抽样行数。
全量收集
收集列统计信息
列统计信息主要包括列的行数、最大值、最小值、NULL 值个数等通过 ANALYZE TABLE 语句进行收集。
示例
收集 example_tbl 表所有列的统计信息使用以下语法
mysql ANALYZE TABLE stats_test.example_tbl;
--------
| job_id |
--------
| 51730 |
--------收集 example_tbl 表 city, age, sex 列的统计信息使用以下语法
mysql ANALYZE TABLE stats_test.example_tbl(city, age, sex);
--------
| job_id |
--------
| 51808 |
--------增量收集
对于分区表在进行全量收集后如果新增分区或者删除分区可以使用增量收集来提高统计信息收集的速度。
使用增量收集时系统会自动检查新增的分区或者已删除的分区。有以下三种情形
对于新增分区收集新分区的统计信息后和历史统计信息合并/汇总。对于已删除的分区重新刷新历史统计信息。无新增/删除的分区不做任何操作。
增量收集适合类似时间列这样的单调不减列作为分区的表或者历史分区数据不会更新的表。
注意
直方图统计信息不支持增量收集。使用增量收集时必须保证表存量的统计信息可用即其他历史分区数据不发生变化否则会导致统计信息有误差。
示例
增量收集 example_tbl 表的统计信息使用以下语法
-- 使用with incremental
mysql ANALYZE TABLE stats_test.example_tbl WITH INCREMENTAL;
--------
| job_id |
--------
| 51910 |
---------- 配置incremental
mysql ANALYZE TABLE stats_test.example_tbl PROPERTIES(incremental true);
--------
| job_id |
--------
| 51910 |
--------抽样收集
在表数据量较大时系统收集统计信息可能会比较耗时可以使用抽样收集来提高统计信息收集的速度。根据实际情况指定抽样的比例或者抽样的行数。
示例
抽样收集 example_tbl 表的统计信息使用以下语法
-- 使用with sample rows抽样行数
mysql ANALYZE TABLE stats_test.example_tbl WITH SAMPLE ROWS 5;
--------
| job_id |
--------
| 52120 |
---------- 使用with sample percent抽样比例
mysql ANALYZE TABLE stats_test.example_tbl WITH SAMPLE PERCENT 50;
--------
| job_id |
--------
| 52201 |
---------- 配置sample.row抽样行数
mysql ANALYZE TABLE stats_test.example_tbl PROPERTIES(sample.rows 5);
--------
| job_id |
--------
| 52279 |
---------- 配置sample.percent抽样比例
mysql ANALYZE TABLE stats_test.example_tbl PROPERTIES(sample.percent 50);
--------
| job_id |
--------
| 52282 |
--------同步收集
一般执行 ANALYZE 语句后系统会启动异步任务去收集统计信息并立刻返回统计任务 ID。如果想要等待统计信息收集结束后返会可以使用同步收集方式。
示例
抽样收集 example_tbl 表的统计信息使用以下语法
-- 使用with sync
mysql ANALYZE TABLE stats_test.example_tbl WITH SYNC;-- 配置sync
mysql ANALYZE TABLE stats_test.example_tbl PROPERTIES(sync true);自动收集
自动收集是指用户在执行 ANALYZE 语句时指定 PERIOD 或者 AUTO 关键字或者进行相关配置时系统后续将自动生成任务进行统计信息的收集。
周期性收集
周期性收集是指在一定时间间隔内重新收集表相应的统计信息。
示例
周期性每隔一天收集 example_tbl 表的统计信息使用以下语法
-- 使用with period
mysql ANALYZE TABLE stats_test.example_tbl WITH PERIOD 86400;
--------
| job_id |
--------
| 52409 |
---------- 配置period.seconds
mysql ANALYZE TABLE stats_test.example_tbl PROPERTIES(period.seconds 86400);
--------
| job_id |
--------
| 52535 |
--------管理任务
查看统计任务
通过 SHOW ANALYZE 来查看统计信息收集任务的信息。
语法如下
SHOW ANALYZE table_name | job_id [ WHERE [ STATE [ PENDING | RUNNING | FINISHED | FAILED ] ] ];其中
table_name表名指定后可查看该表对应的统计任务信息。可以是 db_name.table_name 形式。不指定时返回所有统计任务信息。job_id统计信息任务 ID执行 ANALYZE 非同步收集统计信息时所返回的值。不指定时返回所有统计任务信息。
目前 SHOW ANALYZE 会输出 11 列具体如下
列名说明job_id统计任务 IDcatalog_namecatalog 名称db_name数据库名称tbl_name表名称col_name列名称job_type任务类型analysis_type统计类型message任务信息last_exec_time_in_ms上次执行时间state任务状态schedule_type调度方式 在系统中统计信息任务包含多个子任务每个子任务单独收集一列的统计信息。 示例
查看 ID 为 20038 的统计任务信息使用以下语法
mysql SHOW ANALYZE 20038
--------------------------------------------------------------------------------------------------------------------------------------------------------------
| job_id | catalog_name | db_name | tbl_name | col_name | job_type | analysis_type | message | last_exec_time_in_ms | state | schedule_type |
--------------------------------------------------------------------------------------------------------------------------------------------------------------
| 20038 | internal | default_cluster:test | t3 | [col4,col2,col3,col1] | MANUAL | FUNDAMENTALS | | 2023-06-01 17:22:15 | FINISHED | ONCE |
-------------------------------------------------------------------------------------------------------------------------------------------------------------- 可通过SHOW ANALYZE TASK STATUS [job_id]查看具体每个列统计信息的收集完成情况。
mysql show analyze task status 20038 ;
------------------------------------------------------------
| task_id | col_name | message | last_exec_time_in_ms | state |
------------------------------------------------------------
| 20039 | col4 | | 2023-06-01 17:22:15 | FINISHED |
| 20040 | col2 | | 2023-06-01 17:22:15 | FINISHED |
| 20041 | col3 | | 2023-06-01 17:22:15 | FINISHED |
| 20042 | col1 | | 2023-06-01 17:22:15 | FINISHED |
------------------------------------------------------------ 查看 example_tbl 表的的统计任务信息使用以下语法
mysql SHOW ANALYZE stats_test.example_tbl;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
| job_id | catalog_name | db_name | tbl_name | col_name | job_type | analysis_type | message | last_exec_time_in_ms | state | schedule_type |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
| 68603 | internal | default_cluster:stats_test | example_tbl | | MANUAL | INDEX | | 2023-05-05 17:53:27 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | last_visit_date | MANUAL | COLUMN | | 2023-05-05 17:53:26 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | age | MANUAL | COLUMN | | 2023-05-05 17:53:27 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | city | MANUAL | COLUMN | | 2023-05-05 17:53:25 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | cost | MANUAL | COLUMN | | 2023-05-05 17:53:27 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | min_dwell_time | MANUAL | COLUMN | | 2023-05-05 17:53:24 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | date | MANUAL | COLUMN | | 2023-05-05 17:53:27 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | user_id | MANUAL | COLUMN | | 2023-05-05 17:53:25 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | max_dwell_time | MANUAL | COLUMN | | 2023-05-05 17:53:26 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | sex | MANUAL | COLUMN | | 2023-05-05 17:53:26 | FINISHED | ONCE |查看所有的统计任务信息并按照上次完成时间降序返回前 3 条信息使用以下语法
mysql SHOW ANALYZE WHERE state FINISHED ORDER BY last_exec_time_in_ms DESC LIMIT 3;
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
| job_id | catalog_name | db_name | tbl_name | col_name | job_type | analysis_type | message | last_exec_time_in_ms | state | schedule_type |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
| 68603 | internal | default_cluster:stats_test | example_tbl | age | MANUAL | COLUMN | | 2023-05-05 17:53:27 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | sex | MANUAL | COLUMN | | 2023-05-05 17:53:26 | FINISHED | ONCE |
| 68603 | internal | default_cluster:stats_test | example_tbl | last_visit_date | MANUAL | COLUMN | | 2023-05-05 17:53:26 | FINISHED | ONCE |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------终止统计任务
通过 KILL ANALYZE 来终止正在运行的统计任务。
语法如下
KILL ANALYZE job_id;其中
job_id统计信息任务 ID。执行 ANALYZE 非同步收集统计信息时所返回的值也可以通过 SHOW ANALYZE 语句获取。
示例
终止 ID 为 52357 的统计任务。
mysql KILL ANALYZE 52357;查看统计信息
表统计信息 暂不可用。 通过 SHOW TABLE STATS 来查看表的总行数以及统计信息健康度等信息。
语法如下
SHOW TABLE STATS table_name [ PARTITION (partition_name) ];其中
table_name: 导入数据的目标表。可以是 db_name.table_name 形式。partition_name: 指定的目标分区。必须是 table_name 中存在的分区只能指定一个分区。
目前 SHOW TABLE STATS 会输出 6 列具体如下
列名说明row_count行数update_rows更新的行数data_size数据大小。单位 bytehealthy健康度update_time更新时间last_analyze_time上次收集统计信息的时间
示例
查看 example_tbl 表的统计信息使用以下语法
mysql SHOW TABLE STATS stats_test.example_tbl;
--------------------------------------------------------------------------------------
| row_count | update_rows | healthy | data_size | update_time | last_analyze_time |
--------------------------------------------------------------------------------------
| 8 | 0 | 100 | 6999 | 2023-04-08 15:40:47 | 2023-04-08 17:43:28 |
--------------------------------------------------------------------------------------查看 example_tbl 表 p_201701 分区的统计信息使用以下语法
mysql SHOW TABLE STATS stats_test.example_tbl PARTITION (p_201701);
--------------------------------------------------------------------------------------
| row_count | update_rows | healthy | data_size | update_time | last_analyze_time |
--------------------------------------------------------------------------------------
| 4 | 0 | 100 | 2805 | 2023-04-08 11:48:02 | 2023-04-08 17:43:27 |
--------------------------------------------------------------------------------------查看列统计信息
通过 SHOW COLUMN STATS 来查看列的不同值数以及 NULL 数量等信息。
语法如下
SHOW COLUMN [cached] STATS table_name [ (column_name [, ...]) ] [ PARTITION (partition_name) ];其中
cached: 展示当前FE内存缓存中的统计信息。table_name: 收集统计信息的目标表。可以是 db_name.table_name 形式。column_name: 指定的目标列必须是 table_name 中存在的列多个列名称用逗号分隔。partition_name: 指定的目标分区必须是 table_name 中存在的分区只能指定一个分区。
目前 SHOW COLUMN STATS 会输出 10 列具体如下
列名说明column_name列名称count列的总行数ndv不同值的个数num_null空值的个数data_size列的总⻓度单位 bytesavg_size_byte列的平均⻓度单位 bytesmin列最小值max列最⼤值
示例
查看 example_tbl 表所有列的统计信息使用以下语法
mysql SHOW COLUMN STATS stats_test.example_tbl;
----------------------------------------------------------------------------------------------------------------------------
| column_name | count | ndv | num_null | data_size | avg_size_byte | min | max |
----------------------------------------------------------------------------------------------------------------------------
| date | 6.0 | 3.0 | 0.0 | 28.0 | 4.0 | 2017-10-01 | 2017-10-03 |
| cost | 6.0 | 6.0 | 0.0 | 56.0 | 8.0 | 2 | 200 |
| min_dwell_time | 6.0 | 6.0 | 0.0 | 28.0 | 4.0 | 2 | 22 |
| city | 6.0 | 4.0 | 0.0 | 54.0 | 7.0 | Beijing | Shenzhen |
| user_id | 6.0 | 5.0 | 0.0 | 112.0 | 16.0 | 10000 | 10004 |
| sex | 6.0 | 2.0 | 0.0 | 7.0 | 1.0 | 0 | 1 |
| max_dwell_time | 6.0 | 6.0 | 0.0 | 28.0 | 4.0 | 3 | 22 |
| last_visit_date | 6.0 | 6.0 | 0.0 | 112.0 | 16.0 | 2017-10-01 06:00:00 | 2017-10-03 10:20:22 |
| age | 6.0 | 4.0 | 0.0 | 14.0 | 2.0 | 20 | 35 |
----------------------------------------------------------------------------------------------------------------------------查看 example_tbl 表 p_201701 分区的统计信息使用以下语法
mysql SHOW COLUMN STATS stats_test.example_tbl PARTITION (p_201701);
-----------------------------------------------------------------------------------------------------------------------------
| column_name | count | ndv | num_null | data_size | avg_size_byte | min | max |
-----------------------------------------------------------------------------------------------------------------------------
| date | 3.0 | 1.0 | 0.0 | 16.0 | 4.0 | 2017-10-01 | 2017-10-01 |
| cost | 3.0 | 3.0 | 0.0 | 32.0 | 8.0 | 2 | 100 |
| min_dwell_time | 3.0 | 3.0 | 0.0 | 16.0 | 4.0 | 2 | 22 |
| city | 3.0 | 2.0 | 0.0 | 29.0 | 7.0 | Beijing | Shenzhen |
| user_id | 3.0 | 3.0 | 0.0 | 64.0 | 16.0 | 10000 | 10004 |
| sex | 3.0 | 2.0 | 0.0 | 4.0 | 1.0 | 0 | 1 |
| max_dwell_time | 3.0 | 3.0 | 0.0 | 16.0 | 4.0 | 3 | 22 |
| last_visit_date | 3.0 | 3.0 | 0.0 | 64.0 | 16.0 | 2017-10-01 06:00:00 | 2017-10-01 17:05:45 |
| age | 3.0 | 3.0 | 0.0 | 8.0 | 2.0 | 20 | 35 |
-----------------------------------------------------------------------------------------------------------------------------查看 example_tbl 表 city, age, sex 列的统计信息使用以下语法
mysql SHOW COLUMN STATS stats_test.example_tbl(city, age, sex);
-------------------------------------------------------------------------------------------------
| column_name | count | ndv | num_null | data_size | avg_size_byte | min | max |
-------------------------------------------------------------------------------------------------
| city | 6.0 | 4.0 | 0.0 | 54.0 | 7.0 | Beijing | Shenzhen |
| sex | 6.0 | 2.0 | 0.0 | 7.0 | 1.0 | 0 | 1 |
| age | 6.0 | 4.0 | 0.0 | 14.0 | 2.0 | 20 | 35 |
-------------------------------------------------------------------------------------------------查看 example_tbl 表 p_201701 分区 city, age, sex 列的统计信息使用以下语法
mysql SHOW COLUMN STATS stats_test.example_tbl(city, age, sex) PARTITION (p_201701);
--------------------------------------------------------------------------------------------------
| column_name | count | ndv | num_null | data_size | avg_size_byte | min | max |
--------------------------------------------------------------------------------------------------
| city | 3.0 | 2.0 | 0.0 | 29.0 | 7.0 | Beijing | Shenzhen |
| sex | 3.0 | 2.0 | 0.0 | 4.0 | 1.0 | 0 | 1 |
| age | 3.0 | 3.0 | 0.0 | 8.0 | 2.0 | 20 | 35 |
--------------------------------------------------------------------------------------------------修改统计信息
⽤户可以通过 ALTER 语句调整统计信息。
ALTER TABLE table_name MODIFY COLUMN column_name SET STATS (stat_name stat_value, ...) [ PARTITION (partition_name) ];其中
table_name: 删除统计信息的目标表。可以是 db_name.table_name 形式。column_name: 指定的目标列必须是 table_name 中存在的列每次只能修改一列的统计信息。stat_name 和 stat_value: 相应的统计信息名称和统计信息信息的值多个统计信息逗号分隔。可以修改的统计信息包括 row_count, ndv, num_nulls, min_value, max_value, data_size。partition_name: 指定的目标分区。必须是 table_name 中存在的分区多个分区使用逗号分割。
示例
修改 example_tbl 表 age 列 row_count 统计信息使用以下语法
mysql ALTER TABLE stats_test.example_tbl MODIFY COLUMN age SET STATS (row_count6001215);
mysql SHOW COLUMN STATS stats_test.example_tbl(age);
------------------------------------------------------------------------------
| column_name | count | ndv | num_null | data_size | avg_size_byte | min | max |
------------------------------------------------------------------------------
| age | 6001215.0 | 0.0 | 0.0 | 0.0 | 0.0 | N/A | N/A |
------------------------------------------------------------------------------修改 example_tbl 表 age 列 row_count, num_nulls, data_size 统计信息使用以下语法
mysql ALTER TABLE stats_test.example_tbl MODIFY COLUMN age SET STATS (row_count6001215, num_nulls2023, data_size600121522);
mysql SHOW COLUMN STATS stats_test.example_tbl(age);
------------------------------------------------------------------------------
| column_name | count | ndv | num_null | data_size | avg_size_byte | min | max |
------------------------------------------------------------------------------
| age | 6001215.0 | 0.0 | 2023.0 | 600121522 | 0.0 | N/A | N/A |
------------------------------------------------------------------------------删除统计信息
⽤户通过 DROP 语句删除统计信息根据提供的参数删除指定的表、分区或列的统计信息。删除时会同时删除列统计信息和列直方图信息。
语法
DROP [ EXPIRED ] STATS [ table_name [ (column_name [, ...]) ] ];其中
table_name: 要删除统计信息的目标表。可以是 db_name.table_name 形式。column_name: 指定的目标列。必须是 table_name 中存在的列多个列名称用逗号分隔。expired统计信息清理。不能指定表会删除系统中无效的统计信息以及过期的统计任务信息。
示例
清理统计信息使用以下语法
mysql DROP EXPIRED STATS;删除 example_tbl 表的统计信息使用以下语法
mysql DROP STATS stats_test.example_tbl;删除 example_tbl 表 city, age, sex 列的统计信息使用以下语法
mysql DROP STATS stats_test.example_tbl(city, age, sex);删除Analyze Job
用于根据job id删除自动/周期Analyze作业
DROP ANALYZE JOB [JOB_ID]配置项
confcommentdefault valuestatistics_sql_parallel_exec_instance_num控制每个统计信息收集SQL在BE侧的并发实例数/pipeline task num1statistics_sql_mem_limit_in_bytes控制每个统计信息SQL可占用的BE内存2L 1024 1024 * 1024 (2GiB)statistics_simultaneously_running_task_num通过ANALYZE TABLE[DATABASE]提交异步作业后可同时analyze的列的数量所有异步任务共同受到该参数约束5analyze_task_timeout_in_minutesAnalyzeTask执行超时时间12 hoursstats_cache_size统计信息缓存的实际内存占用大小高度依赖于数据的特性因为在不同的数据集和场景中最大/最小值的平均大小和直方图的桶数量会有很大的差异。此外JVM版本等因素也会对其产生影响。下面给出统计信息缓存在包含100000个项目时所占用的内存大小。每个项目的最大/最小值的平均长度为32列名的平均长度为16统计信息缓存总共占用了61.2777404785MiB的内存。强烈不建议分析具有非常大字符串值的列因为这可能导致FE内存溢出。100000
常见问题
ANALYZE WITH SYNC 执行失败Failed to analyze following columns...
SQL执行时间受query_timeout会话变量控制该变量默认值为300秒ANALYZE DATABASE/TABLE等语句通常耗时较大很容易超过该时间限制而被cancel建议根据ANALYZE对象的数据量适当增大query_timeout的值。
ANALYZE提交报错Stats table not available...
执行ANALYZE时统计数据会被写入到内部表__internal_schema.column_statistics中FE会在执行ANALYZE前检查该表tablet状态如果存在不可用的tablet则拒绝执行任务。出现该报错请检查BE集群状态。
大表ANALYZE失败
由于ANALYZE能够使用的资源受到比较严格的限制对一些大表的ANALYZE操作有可能超时或者超出BE内存限制。这些情况下建议使用 ANALYZE ... WITH SAMPLE...。此外对于动态分区表的场景强烈建议使用ANALYZE ... WITH INCREMENTAL...该语句仅增量的处理数据更新的分区能够避免大量的重复计算从而提高效率。