达梦数据库中的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.
异同点分析
相似点
-
功能目标:
- 两者均是为了收集表及其索引的统计信息,帮助优化器生成更优的查询计划。
-
基本参数类型:
- 都需要模式名称和表名称作为参数输入。
不同点
-
功能细粒度:
DBMS_STATS
提供了更为细粒度、灵活的统计信息收集方法,支持更多的选项和参数配置。sp_tab_stat_init
相对简单直接,只需指定模式名称和表名称即可。
-
使用场景:
DBMS_STATS
适用于需要更细粒度控制和定制化统计信息收集的场景。sp_tab_stat_init
适用于需要快速、简便地收集单个表统计信息的场景。
-
功能扩展:
DBMS_STATS
还能够收集模式级别的统计信息,并且可以自动计算优化的采样值。sp_tab_stat_init
主要作用于单个表和其索引,不支持模式级别的统计信息收集。
-
性能和灵活性:
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
:适用于简单、直接的统计信息收集场景,易于使用。
根据具体需求选择合适的存储过程或包,可以有效提升数据库查询性能和整体运维效率。