1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

yashandb教程FG030-YashanDB统计信息更新

本文档风哥主要介绍YashanDB统计信息更新的相关知识,包括YashanDB统计信息的概念、类型、重要性,以及如何收集、分析和优化统计信息,风哥教程参考YashanDB官方文档SQL语言参考手册内容,适合DBA和开发人员在学习和测试中使用。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 YashanDB统计信息概念

YashanDB统计信息是描述数据库对象(如表、索引)数据分布情况的元数据。统计信息包括表的行数、列的分布情况、索引的深度和选择性等信息,这些信息被数据库优化器用来生成最佳执行计划。学习交流加群风哥微信: itpux-com

YashanDB统计信息的特点:

  • 描述数据库对象的数据分布情况
  • 被优化器用来生成执行计划
  • 影响SQL语句的执行性能
  • 需要定期更新以保持准确性
  • 可以手动或自动收集

1.2 YashanDB统计信息类型

YashanDB支持以下类型的统计信息:

# 统计信息类型
– 表统计信息:行数、块数、平均行大小等
– 列统计信息:列的最小值、最大值、直方图等
– 索引统计信息:索引深度、叶子节点数、聚簇因子等
– 系统统计信息:CPU速度、I/O性能等
– 直方图统计信息:列值的分布情况

1.3 YashanDB统计信息的重要性

YashanDB统计信息的重要性:

  • 影响执行计划:统计信息是优化器生成执行计划的重要依据
  • 影响查询性能:准确的统计信息有助于生成最优执行计划
  • 影响系统稳定性:不准确的统计信息可能导致执行计划不稳定
  • 影响资源消耗:最优执行计划可以减少系统资源消耗
  • 影响并发性能:高效的执行计划可以提高系统的并发处理能力
风哥提示:统计信息是数据库优化器生成执行计划的重要依据。建议定期更新统计信息,确保优化器能够生成最优的执行计划。学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 YashanDB统计信息生成

YashanDB统计信息的生成过程:

# 统计信息生成过程
1. 采样:从表中随机采样数据
2. 计算:根据采样数据计算统计信息
3. 存储:将统计信息存储在数据字典中
4. 使用:优化器使用统计信息生成执行计划

2.2 YashanDB统计信息维护

YashanDB统计信息的维护策略:

统计信息维护策略:

  • 定期更新:根据数据变化频率定期更新统计信息
  • 自动更新:启用自动统计信息收集
  • 手动更新:在数据变化较大时手动更新统计信息
  • 增量更新:只更新变化部分的统计信息
  • 全量更新:对整个表或索引进行统计信息收集

2.3 YashanDB统计信息最佳实践

YashanDB统计信息的最佳实践:

  • 定期更新:每周或每月更新统计信息
  • 在数据变化后更新:在大量数据插入、更新或删除后更新统计信息
  • 使用适当的采样率:根据表大小选择合适的采样率
  • 收集系统统计信息:定期收集系统统计信息
  • 监控统计信息状态:定期检查统计信息的有效性
风哥提示:统计信息的准确性直接影响SQL语句的执行性能。建议建立统计信息维护计划,定期更新统计信息,确保优化器能够生成最优的执行计划。更多学习教程公众号风哥教程itpux_com

Part03-生产环境项目实施方案

3.1 YashanDB统计信息收集

3.1.1 YashanDB统计信息收集命令

— 创建测试表
CREATE TABLE fgedu_employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
department VARCHAR2(100),
salary NUMBER,
hire_date DATE
);

— 插入测试数据
INSERT INTO fgedu_employees VALUES (1, ‘张三’, ‘技术部’, 5000, SYSDATE – 365);
INSERT INTO fgedu_employees VALUES (2, ‘李四’, ‘销售部’, 6000, SYSDATE – 180);
INSERT INTO fgedu_employees VALUES (3, ‘王五’, ‘技术部’, 7000, SYSDATE – 90);
INSERT INTO fgedu_employees VALUES (4, ‘赵六’, ‘销售部’, 8000, SYSDATE – 30);
INSERT INTO fgedu_employees VALUES (5, ‘孙七’, ‘技术部’, 9000, SYSDATE);

— 收集表的统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’);

— 收集表的统计信息(指定采样率)
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’, estimate_percent => 100);

— 收集模式的统计信息
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(‘FGEDU’);

— 收集数据库的统计信息
EXEC DBMS_STATS.GATHER_DATABASE_STATS;

— 收集索引的统计信息
EXEC DBMS_STATS.GATHER_INDEX_STATS(‘FGEDU’, ‘PK__FGEDU_EMPLOYEES__EMP_ID’);

— 收集系统统计信息
EXEC DBMS_STATS.GATHER_SYSTEM_STATS;

3.1.2 YashanDB统计信息收集参数

# DBMS_STATS.GATHER_TABLE_STATS参数说明
– ownname: 表所有者
– tabname: 表名
– partname: 分区名(可选)
– estimate_percent: 采样率(0-100,默认值为DBMS_STATS.AUTO_SAMPLE_SIZE)
– block_sample: 是否使用块采样(默认值为FALSE)
– method_opt: 直方图收集选项(默认值为’FOR ALL COLUMNS SIZE AUTO’)
– degree: 并行度(默认值为NULL)
– granularity: 粒度(默认值为’AUTO’)
– cascade: 是否收集索引统计信息(默认值为FALSE)
– stattab: 统计信息表名(可选)
– statid: 统计信息ID(可选)
– options: 收集选项(默认值为’GATHER’)
– objlist: 对象列表(可选)
– statown: 统计信息表所有者(可选)

3.2 YashanDB统计信息分析

3.2.1 YashanDB统计信息查看

— 查看表的统计信息
SELECT table_name, num_rows, blocks, avg_row_len
FROM user_tables
WHERE table_name = ‘FGEDU_EMPLOYEES’;

TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN
—————————— ———- ———- ———–
FGEDU_EMPLOYEES 5 1 38

— 查看列的统计信息
SELECT column_name, num_distinct, density, num_nulls, low_value, high_value
FROM user_tab_col_statistics
WHERE table_name = ‘FGEDU_EMPLOYEES’;

COLUMN_NAME NUM_DISTINCT DENSITY NUM_NULLS LOW_VALUE HIGH_VALUE
—————————— ———— ———- ———- ——————————– ————————-
EMP_ID 5 .2 0 C102 C106
EMP_NAME 5 .2 0 78E5849C E5AD99E4B883
DEPARTMENT 2 .5 0 E58C96E68A80E983A8 E99480E594AE
SALARY 5 .2 0 40A0 40F0
HIRE_DATE 5 .2 0 78770C22 78770D6A

— 查看索引的统计信息
SELECT index_name, blevel, leaf_blocks, distinct_keys, num_rows
FROM user_indexes
WHERE table_name = ‘FGEDU_EMPLOYEES’;

INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS NUM_ROWS
—————————— —— ———– ————- ———-
PK__FGEDU_EMPLOYEES__EMP_ID 0 1 5 5

3.2.2 YashanDB统计信息验证

— 验证统计信息的有效性
SELECT table_name, last_analyzed
FROM user_tables
WHERE table_name = ‘FGEDU_EMPLOYEES’;

TABLE_NAME LAST_ANALYZED
—————————— —————
FGEDU_EMPLOYEES 2026-04-11 10:00:00

— 检查统计信息是否过期
SELECT table_name, num_rows, (SELECT COUNT(*) FROM fgedu_employees) AS actual_rows
FROM user_tables
WHERE table_name = ‘FGEDU_EMPLOYEES’;

TABLE_NAME NUM_ROWS ACTUAL_ROWS
—————————— ———- ———–
FGEDU_EMPLOYEES 5 5

— 查看直方图信息
SELECT column_name, histogram, num_buckets
FROM user_tab_col_statistics
WHERE table_name = ‘FGEDU_EMPLOYEES’;

COLUMN_NAME HISTOGRAM NUM_BUCKETS
—————————— ————— ————
EMP_ID NONE 1
EMP_NAME NONE 1
DEPARTMENT FREQUENCY 2
SALARY NONE 1
HIRE_DATE NONE 1

3.3 YashanDB统计信息优化

3.3.1 YashanDB统计信息优化策略

— 优化统计信息收集
— 1. 使用并行收集
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’, degree => 4);

— 2. 收集直方图
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’, method_opt => ‘FOR ALL COLUMNS SIZE AUTO’);

— 3. 增量收集(对于分区表)
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’, granularity => ‘AUTO’);

— 4. 保存统计信息
EXEC DBMS_STATS.CREATE_STAT_TABLE(‘FGEDU’, ‘FGEDU_STATS_TABLE’);
EXEC DBMS_STATS.EXPORT_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’, stattab => ‘FGEDU_STATS_TABLE’);

— 5. 恢复统计信息
EXEC DBMS_STATS.IMPORT_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’, stattab => ‘FGEDU_STATS_TABLE’);

— 6. 删除统计信息
EXEC DBMS_STATS.DELETE_TABLE_STATS(‘FGEDU’, ‘FGEDU_EMPLOYEES’);

3.3.2 YashanDB统计信息自动收集

— 启用自动统计信息收集
— 查看自动统计信息收集任务
SELECT client_name, status
FROM dba_scheduler_jobs
WHERE client_name = ‘DBMS_STATS收集任务’;

— 修改自动统计信息收集任务
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE(
‘SYS.DBMS_STATS收集任务’,
‘repeat_interval’,
‘FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0’
);

— 手动执行自动统计信息收集任务
EXEC DBMS_SCHEDULER.RUN_JOB(‘SYS.DBMS_STATS收集任务’);

风哥提示:统计信息的优化需要根据实际情况进行调整。建议根据表的大小、数据变化频率等因素,选择合适的统计信息收集策略。from yashandb视频:www.itpux.com

Part04-生产案例与实战讲解

4.1 YashanDB统计信息更新实战案例

在生产环境中,定期更新统计信息以确保查询性能:

— 案例:定期更新统计信息
— 1. 创建存储过程自动更新统计信息
CREATE OR REPLACE PROCEDURE fgedu_update_stats IS
BEGIN
— 更新模式的统计信息
DBMS_STATS.GATHER_SCHEMA_STATS(
ownname => ‘FGEDU’,
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO’,
degree => 4,
cascade => TRUE
);

— 记录日志
DBMS_OUTPUT.PUT_LINE(‘统计信息更新完成:’ || TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’));
END;
/

— 2. 执行存储过程
EXEC fgedu_update_stats;

统计信息更新完成:2026-04-11 10:00:00

— 3. 创建定时任务
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => ‘FGEDU_UPDATE_STATS_JOB’,
job_type => ‘PLSQL_BLOCK’,
job_action => ‘BEGIN fgedu_update_stats; END;’,
start_date => SYSTIMESTAMP,
repeat_interval => ‘FREQ=WEEKLY; BYDAY=SUN; BYHOUR=2; BYMINUTE=0; BYSECOND=0’,
enabled => TRUE,
comments => ‘每周日凌晨2点更新统计信息’
);
END;
/

— 4. 查看定时任务
SELECT job_name, enabled, next_run_date
FROM dba_scheduler_jobs
WHERE job_name = ‘FGEDU_UPDATE_STATS_JOB’;

JOB_NAME ENAB NEXT_RUN_DATE
—————————— —- ——————–
FGEDU_UPDATE_STATS_JOB TRUE 2026-04-12 02:00:00

4.2 YashanDB统计信息性能影响案例

在生产环境中,统计信息对查询性能的影响:

— 案例:统计信息对执行计划的影响
— 1. 创建测试表并插入大量数据
CREATE TABLE fgedu_large_table (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
value NUMBER
);

— 插入100000行数据
BEGIN
FOR i IN 1..100000 LOOP
INSERT INTO fgedu_large_table VALUES (i, ‘Name’ || i, i);
END LOOP;
COMMIT;
END;
/

— 2. 查看执行计划(无统计信息)
EXPLAIN PLAN FOR
SELECT * FROM fgedu_large_table WHERE value > 50000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 3. 收集统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_LARGE_TABLE’);

— 4. 查看执行计划(有统计信息)
EXPLAIN PLAN FOR
SELECT * FROM fgedu_large_table WHERE value > 50000;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

— 5. 比较执行计划
— 执行计划会根据统计信息调整,可能使用不同的访问路径

4.3 YashanDB统计信息故障排除案例

在生产环境中,解决统计信息相关的问题:

— 案例:统计信息过期导致的性能问题
— 1. 症状:查询执行时间突然变长
— 2. 分析:检查统计信息是否过期
SELECT table_name, last_analyzed
FROM user_tables
WHERE table_name = ‘FGEDU_LARGE_TABLE’;

TABLE_NAME LAST_ANALYZED
—————————— —————
FGEDU_LARGE_TABLE 2026-01-01 10:00:00

— 3. 解决:更新统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(‘FGEDU’, ‘FGEDU_LARGE_TABLE’);

— 4. 验证:重新执行查询
SELECT * FROM fgedu_large_table WHERE value > 50000;

— 执行时间明显缩短

— 案例:直方图缺失导致的执行计划问题
— 1. 症状:查询使用了不合适的执行计划
— 2. 分析:检查直方图信息
SELECT column_name, histogram
FROM user_tab_col_statistics
WHERE table_name = ‘FGEDU_EMPLOYEES’ AND column_name = ‘DEPARTMENT’;

COLUMN_NAME HISTOGRAM
—————————— —————
DEPARTMENT NONE

— 3. 解决:收集直方图
EXEC DBMS_STATS.GATHER_TABLE_STATS(
‘FGEDU’,
‘FGEDU_EMPLOYEES’,
method_opt => ‘FOR COLUMNS DEPARTMENT SIZE 254’
);

— 4. 验证:检查直方图信息
SELECT column_name, histogram, num_buckets
FROM user_tab_col_statistics
WHERE table_name = ‘FGEDU_EMPLOYEES’ AND column_name = ‘DEPARTMENT’;

COLUMN_NAME HISTOGRAM NUM_BUCKETS
—————————— ————— ————
DEPARTMENT FREQUENCY 2

生产环境建议:在生产环境中,统计信息的维护是数据库性能管理的重要部分。建议建立统计信息维护计划,定期更新统计信息,确保优化器能够生成最优的执行计划。更多视频教程www.fgedu.net.cn

Part05-风哥经验总结与分享

5.1 YashanDB统计信息使用经验

YashanDB统计信息使用经验总结:

  • 定期更新:根据数据变化频率定期更新统计信息
  • 合理采样:根据表大小选择合适的采样率
  • 收集直方图:为分布不均匀的列收集直方图
  • 并行收集:使用并行收集提高效率
  • 保存统计信息:定期备份统计信息,以便在需要时恢复
  • 监控统计信息:定期检查统计信息的有效性

5.2 YashanDB统计信息常见问题

# 常见问题及解决方法

## 1. 统计信息过期
– 症状:查询执行时间变长,执行计划不佳
– 原因:数据变化后统计信息未更新
– 解决:更新统计信息

## 2. 直方图缺失
– 症状:执行计划不准确,特别是对于分布不均匀的列
– 原因:未收集直方图或直方图设置不当
– 解决:为相关列收集直方图

## 3. 统计信息收集时间长
– 症状:统计信息收集过程耗时过长
– 原因:表过大,采样率过高
– 解决:使用并行收集,调整采样率

## 4. 统计信息不一致
– 症状:不同会话看到的统计信息不同
– 原因:统计信息更新过程中被其他操作干扰
– 解决:在系统负载低时更新统计信息

## 5. 自动统计信息收集失败
– 症状:自动统计信息收集任务未执行
– 原因:任务被禁用,或系统资源不足
– 解决:检查任务状态,确保系统资源充足

5.3 YashanDB统计信息使用建议

YashanDB统计信息使用建议:

  • 建立维护计划:制定统计信息维护计划,定期更新统计信息
  • 监控数据变化:监控表数据的变化情况,及时更新统计信息
  • 使用自动收集:启用自动统计信息收集,减少人工干预
  • 优化收集参数:根据表的特点调整收集参数
  • 备份统计信息:定期备份统计信息,以便在需要时恢复
  • 测试环境验证:在测试环境验证统计信息更新的效果
  • 持续学习:不断学习统计信息相关的新知识和最佳实践
风哥提示:统计信息是数据库优化器生成执行计划的重要依据。建议定期更新统计信息,确保优化器能够生成最优的执行计划,从而提高系统性能。学习交流加群风哥微信: itpux-com

持续改进:统计信息的维护是一个持续的过程,需要根据实际情况不断调整和改进。建议定期review统计信息的状态,优化收集策略,以确保系统性能的稳定和高效。更多学习教程公众号风哥教程itpux_com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息