达梦数据库中的DBMS_STATS和SP_TAB_STAT_INIT 的异同点

达梦数据库中的DBMS_STATS和SP_TAB_STAT_INIT 的异同点

在达梦数据库(DM Database)中,DBMS_STATS 包和 SP_TAB_STAT_INIT 存储过程都用于收集表的统计信息。尽管它们的目的都是为了帮助优化器生成更高效的查询计划,但它们的使用方法和功能有些不同。下面我们来详细探讨这两者的异同点。

DBMS_STATS

功能

DBMS_STATS 包提供了一个广泛的接口用于收集、管理和维护统计信息。可以对表、索引、列等不同粒度的统计信息进行更细粒度的控制。

常用方法及语法
  • 收集表统计信息

    BEGIN
        DBMS_STATS.GATHER_TABLE_STATS(
            OWNNAME          => 'schema_name',
            TABNAME          => 'table_name',
            ESTIMATE_PERCENT => estimate_percent
        );
    END;
    
  • 收集模式的统计信息

    BEGIN
        DBMS_STATS.GATHER_SCHEMA_STATS(
            OWNNAME          => 'schema_name',
            ESTIMATE_PERCENT => estimate_percent
        );
    END;
    
  • 常用参数

    • OWNNAME:模式名称
    • TABNAME:表名称
    • ESTIMATE_PERCENT:采样比例,可以是数值或者 DBMS_STATS.AUTO_SAMPLE_SIZE
示例

收集 PUBLIC 模式下 EMPLOYEE 表的统计信息,参数如后所示:

BEGIN
    DBMS_STATS.GATHER_TABLE_STATS(
        OWNNAME          => 'PUBLIC',
        TABNAME          => 'EMPLOYEE',
        ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE
    );
END;

sp_tab_stat_init

功能

sp_tab_stat_init 存储过程主要用于初始化和收集指定表及其索引的统计信息。

语法
sp_tab_stat_init(schema_name, table_name);
参数
  • schema_name:模式名称
  • table_name:表名称
示例

收集 PUBLIC 模式下 EMPLOYEE 表的统计信息:

SQL> sp_tab_stat_init('DMTEST', 'T1');
DMSQL 过程已成功完成
已用时间: 2.046(毫秒). 执行号:817.

异同点分析

相似点
  1. 功能目标

    • 两者均是为了收集表及其索引的统计信息,帮助优化器生成更优的查询计划。
  2. 基本参数类型

    • 都需要模式名称和表名称作为参数输入。
不同点
  1. 功能细粒度

    • DBMS_STATS 提供了更为细粒度、灵活的统计信息收集方法,支持更多的选项和参数配置。
    • sp_tab_stat_init 相对简单直接,只需指定模式名称和表名称即可。
  2. 使用场景

    • DBMS_STATS 适用于需要更细粒度控制和定制化统计信息收集的场景。
    • sp_tab_stat_init 适用于需要快速、简便地收集单个表统计信息的场景。
  3. 功能扩展

    • DBMS_STATS 还能够收集模式级别的统计信息,并且可以自动计算优化的采样值。
    • sp_tab_stat_init 主要作用于单个表和其索引,不支持模式级别的统计信息收集。
  4. 性能和灵活性

    • DBMS_STATS 提供更多选项,可以通过不同的参数调整采样率、并发度等,从而在大数据量环境下更具灵活性和性能优势。
    • sp_tab_stat_init 简单直接,但在复杂场景下可能不够灵活。

任务调度

为了确保优化器使用最新的统计信息,可以通过任务调度定期收集统计信息。

使用 DBMS_SCHEDULER 创建定时任务(示例)
BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        JOB_NAME         => 'GATHER_STATS_JOB',
        JOB_TYPE         => 'PLSQL_BLOCK',
        JOB_ACTION       => 'BEGIN DBMS_STATS.GATHER_TABLE_STATS(''PUBLIC'', ''EMPLOYEE'', DBMS_STATS.AUTO_SAMPLE_SIZE); END;',
        START_DATE       => SYSDATE,
        REPEAT_INTERVAL  => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
        ENABLED          => TRUE
    );
END;

或者使用 sp_tab_stat_init

BEGIN
    DBMS_SCHEDULER.CREATE_JOB(
        JOB_NAME         => 'GATHER_STATS_JOB',
        JOB_TYPE         => 'PLSQL_BLOCK',
        JOB_ACTION       => 'BEGIN EXEC sp_tab_stat_init(''PUBLIC'', ''EMPLOYEE''); END;',
        START_DATE       => SYSDATE,
        REPEAT_INTERVAL  => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0',
        ENABLED          => TRUE
    );
END;

总结

  • 选择 DBMS_STATS:适用于需要更细粒度控制和灵活性的场景,提供了多种选项来优化性能。
  • 选择 sp_tab_stat_init:适用于简单、直接的统计信息收集场景,易于使用。

根据具体需求选择合适的存储过程或包,可以有效提升数据库查询性能和整体运维效率。

  • 39
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值