You need to enable JavaScript to run this app.
文档中心
ByteHouse云数仓版

ByteHouse云数仓版

复制全文
下载 pdf
最佳实践
统计信息和执行计划
复制全文
下载 pdf
统计信息和执行计划

统计信息 Statistic

当前 ByteHouse 自研的查询优化器使用统计信息来提高查询性能。当前支持您手动创建 create stats 来收集数据表的统计信息或修改查询设计,从而提高查询性能。
以下内容将介绍如何创建统计信息,展示统计信息,删除统计信息。ByteHouse 也支持通过控制面开启统计信息,操作详情请参见设置统计信息功能

创建统计信息

CREATE STATS [IF NOT EXISTS] (<db>.* | *.* | [<db>.]<table>['(' <col1>, <col2>, ..., <coln> ')']) 
        [WITH ...]  

参数

是否必填

配置说明

CREATE STATS

用于手动创建数据表统计信息的 SQL 命令。

IF NOT EXISTS

可选参数。如果指定此参数,当统计信息已经存在时,不会抛出错误,而是忽略创建操作。

<db>.*

三选一

指定数据库中的所有表。格式为:数据库名.*。与 *.*[<db>.]<table> 三选一填写即可。

*.*

三选一

指定当前环境中的所有数据库和表。与 <db>.*[<db>.]<table> 三选一填写即可。

[<db>.]<table>

三选一

指定特定的表。可选项包含数据库名,格式为:[数据库名.]表名。与 <db>.**.* 三选一填写即可。

<col1>, <col2>, ..., <coln>

指定表中的特定列。格式为:表名(列1, 列2, ..., 列n)

WITH

用于指定统计信息收集策略,支持指定自动或手动选择策略。

  • 推荐自动选策略:通过设置 statistics_enable_smart_policy=1,即可开启自动选择策略模式。
  • 手动选策略:支持全量扫描收集和采样收集两种方式,您可任选一种方式,设置说明如下:
    • WITH FULLSCAN:指定对表进行全量扫描来收集统计信息。这种方式收集的统计信息最准确,但可能会消耗较多资源和时间。
    • WITH SAMPLE:指定通过采样方式收集统计信息。可以指定采样行数或采样比例。通常需要配置采样行数或比例:
      • <rows> ROWS:指定采样的行数。例如:WITH SAMPLE 10000 ROWS
      • <ratio> RATIO:指定采样的比例。例如:WITH SAMPLE 50 RATIO表示采样 50% 的数据。

使用示例如下:

-- 为 t1 创建统计信息
create stats db1.t1;
create stats t1;
-- create stats for t1.c1, 
-- 为 t1 中 c1 列创建统计信息
create stats t1(c1);
-- 为 t1 中 c1、c2 列创建统计信息
create stats t1(c1, c2);

-- 为所有表创建统计信息,并使用自动选择收集策略
create stats *.* with statistics_enable_smart_policy=1;

-- 为 t1 创建统计信息,并使用手动选择收集策略,强制使用 fullscan
-- 若不强制全量扫描,统计信息的生成逻辑将由参数 statistics_enable_sample 控制
create stats t1 with fullscan 
-- 为所有库的所有表创建统计信息时,按 0.01 比例采样(采样行数取 统计参数 statistics_sample_row_count 与 表总行数的 0.01 倍 的最大值)
create stats *.* with sample 0.01 ratio;
-- 为所有库的所有表创建统计信息时,按 0.01 比例采样(采样行数取 40000000 与 表总行数的 0.01 倍 的最大值)
create stats *.* with sample 0.01 ratio 40000000 rows;
-- 按默认配置采样创建所有库所有表的统计信息
-- 采样规则由参数 statistics_sample_row_count(统计采样行数)和 statistics_sample_ratio(统计采样比例)控制
create stats *.* with sample;

展示统计信息

SHOW (STATS|COLUMN_STATS) (<db>.* | *.* | [<db>.]<table>'('<col1>, <col2>, ..., <coln> ')' ) 

参数

是否必填

配置说明

STATS

选择此参数将显示表级统计信息,包括表的基本元数据信息。

COLUMN_STATS

选择此参数将显示列级统计信息,包括每列的详细数据分布信息。

<db>.*

指定数据库中的所有表。格式为:数据库名.*

ALL

指定当前环境中的所有数据库和表。

[<db>.]<table>

指定特定的表。可选项包含数据库名,格式为:[数据库名.]表名

<col1>, <col2>, ..., <coln>

指定表中的特定列。格式为:表名(列1, 列2, ..., 列n)

删除统计信息

DROP STATS (<db>.* | *.* | [<db>.]<table>['(' <col1>, <col2>, ..., <coln> ')' ]) 

参数

是否必填

配置说明

DROP STATS

核心命令,用于删除统计信息。

<db>.*

指定数据库中的所有表。格式为:数据库名.*

*.*

指定当前环境中的所有数据库和表。

[<db>.]<table>

指定特定的表。可选项包含数据库名,格式为:[数据库名.]表名

<col1>, <col2>, ..., <coln>

指定表中的特定列。格式为:表名(列1, 列2, ..., 列n)

执行计划 Explain Plan

对于数据工程师而言,通过执行计划诊断问题是很重要的排障手段。例如 Join order 的问题,统计信息是否缺失,估算是否合理,下推是否生效等等。ByteHouse 提供展示物理执行计划能力,用 Explain + Query 的方式对执行进行分析,便于更加直观地对查询进行分析和优化,并配合 Query Profiler 查询详情进行可视化展示。执行计划的详情请参见执行计划 EXPLAIN

注意

当前需要先手动收集统计信息后,再生成执行计划。

生成物理执行计划:

EXPLAIN (QUERY Statement) ; 

注意

当前 EXPLAIN 语义仅支持 DQL SELECT 语法的分析。

使用示例
  1. 创建数据库表

    CREATE DATABASE sampledb;
    
    CREATE TABLE sampledb.t1 
    (
      id Int64,
      name Int64
    ) ENGINE = CnchMergeTree()
    ORDER BY id;
    
    CREATE TABLE sampledb.t2
    (
      uid Int64,
      name Int64
    ) ENGINE = CnchMergeTree()
    ORDER BY uid; 
    
  2. 插入样例数据。

    INSERT INTO sampledb.t1 VALUES (1,'bob'),(2,'alice'),(3,'peter'),(4,'jay'),(5,'yiyang'),(6,'aurora');
    INSERT INTO sampledb.t2 VALUES (1,'smith'),(2,'parker'),(3,'taylor'),(4,'davis'),(5,'joines'); 
    
  3. 收集表的统计信息。

    CREATE stats sampledb.t1;
    CREATE stats sampledb.t2; 
    

    展示如下结果:

    table_name

    row_count

    elapsed_time

    t1

    6

    0.026777215

  4. 展示表的统计信息。

    SHOW stats sampledb.t1; 
    
  5. 为数据表生成执行计划。

    USE sampledb;
    EXPLAIN SELECT * FROM t1 JOIN t2 ON (t1.id = t2.uid); 
    

    将展示如下信息:

    Gather Exchange est. 6 rows
    └─ Projection est. 6 rows
    │ Expressions: [id, name, uid], t2.name:=name_1
    └─ Inner Join est. 6 rows
    │ Condition: id == uid
    ├─ Local Exchange est. 6 rows
    │ └─ ReadFromStorage 2100069045.sampledb.t1 est. 6 rows
    │ Outputs: [id, name]
    └─ Broadcast Exchange est. 5 rows
    └─ ReadFromStorage 2100069045.sampledb.t2 est. 5 rows
    Outputs: [uid], name_1:=name 
    
  6. 删除表的统计信息。

    DROP stats sampledb.t1;
    DROP stats sampledb.t1;
    
最近更新时间:2026.02.11 16:35:58
这个页面对您有帮助吗?
有用
有用
无用
无用