yashandb教程FG030-YashanDB统计信息更新
本文档风哥主要介绍YashanDB统计信息更新的相关知识,包括YashanDB统计信息的概念、类型、重要性,以及如何收集、分析和优化统计信息,风哥教程参考YashanDB官方文档SQL语言参考手册内容,适合DBA和开发人员在学习和测试中使用。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 YashanDB统计信息概念
YashanDB统计信息是描述数据库对象(如表、索引)数据分布情况的元数据。统计信息包括表的行数、列的分布情况、索引的深度和选择性等信息,这些信息被数据库优化器用来生成最佳执行计划。学习交流加群风哥微信: itpux-com
- 描述数据库对象的数据分布情况
- 被优化器用来生成执行计划
- 影响SQL语句的执行性能
- 需要定期更新以保持准确性
- 可以手动或自动收集
1.2 YashanDB统计信息类型
YashanDB支持以下类型的统计信息:
– 表统计信息:行数、块数、平均行大小等
– 列统计信息:列的最小值、最大值、直方图等
– 索引统计信息:索引深度、叶子节点数、聚簇因子等
– 系统统计信息:CPU速度、I/O性能等
– 直方图统计信息:列值的分布情况
1.3 YashanDB统计信息的重要性
YashanDB统计信息的重要性:
- 影响执行计划:统计信息是优化器生成执行计划的重要依据
- 影响查询性能:准确的统计信息有助于生成最优执行计划
- 影响系统稳定性:不准确的统计信息可能导致执行计划不稳定
- 影响资源消耗:最优执行计划可以减少系统资源消耗
- 影响并发性能:高效的执行计划可以提高系统的并发处理能力
Part02-生产环境规划与建议
2.1 YashanDB统计信息生成
YashanDB统计信息的生成过程:
1. 采样:从表中随机采样数据
2. 计算:根据采样数据计算统计信息
3. 存储:将统计信息存储在数据字典中
4. 使用:优化器使用统计信息生成执行计划
2.2 YashanDB统计信息维护
YashanDB统计信息的维护策略:
- 定期更新:根据数据变化频率定期更新统计信息
- 自动更新:启用自动统计信息收集
- 手动更新:在数据变化较大时手动更新统计信息
- 增量更新:只更新变化部分的统计信息
- 全量更新:对整个表或索引进行统计信息收集
2.3 YashanDB统计信息最佳实践
YashanDB统计信息的最佳实践:
- 定期更新:每周或每月更新统计信息
- 在数据变化后更新:在大量数据插入、更新或删除后更新统计信息
- 使用适当的采样率:根据表大小选择合适的采样率
- 收集系统统计信息:定期收集系统统计信息
- 监控统计信息状态:定期检查统计信息的有效性
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统计信息收集参数
– 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收集任务’);
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
Part05-风哥经验总结与分享
5.1 YashanDB统计信息使用经验
YashanDB统计信息使用经验总结:
- 定期更新:根据数据变化频率定期更新统计信息
- 合理采样:根据表大小选择合适的采样率
- 收集直方图:为分布不均匀的列收集直方图
- 并行收集:使用并行收集提高效率
- 保存统计信息:定期备份统计信息,以便在需要时恢复
- 监控统计信息:定期检查统计信息的有效性
5.2 YashanDB统计信息常见问题
## 1. 统计信息过期
– 症状:查询执行时间变长,执行计划不佳
– 原因:数据变化后统计信息未更新
– 解决:更新统计信息
## 2. 直方图缺失
– 症状:执行计划不准确,特别是对于分布不均匀的列
– 原因:未收集直方图或直方图设置不当
– 解决:为相关列收集直方图
## 3. 统计信息收集时间长
– 症状:统计信息收集过程耗时过长
– 原因:表过大,采样率过高
– 解决:使用并行收集,调整采样率
## 4. 统计信息不一致
– 症状:不同会话看到的统计信息不同
– 原因:统计信息更新过程中被其他操作干扰
– 解决:在系统负载低时更新统计信息
## 5. 自动统计信息收集失败
– 症状:自动统计信息收集任务未执行
– 原因:任务被禁用,或系统资源不足
– 解决:检查任务状态,确保系统资源充足
5.3 YashanDB统计信息使用建议
YashanDB统计信息使用建议:
- 建立维护计划:制定统计信息维护计划,定期更新统计信息
- 监控数据变化:监控表数据的变化情况,及时更新统计信息
- 使用自动收集:启用自动统计信息收集,减少人工干预
- 优化收集参数:根据表的特点调整收集参数
- 备份统计信息:定期备份统计信息,以便在需要时恢复
- 测试环境验证:在测试环境验证统计信息更新的效果
- 持续学习:不断学习统计信息相关的新知识和最佳实践
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
