Part02-生产环境规划与建议
2.1 统计信息收集方法
统计信息收集的常用方法:
- 手动收集:使用DBMS_STATS包手动收集统计信息
- 自动收集:启用自动统计信息收集任务
- 增量收集:只收集变化部分的统计信息
- 并行收集:使用并行方式收集统计信息,提高效率
- 采样收集:通过采样方式收集统计信息,减少开销
风哥提示:在生产环境中,应根据表的大小和变化频率选择合适的收集方法。
2.2 统计信息收集策略
统计信息收集的策略:
- 定期收集:定期收集统计信息,确保统计信息的准确性
- 增量收集:对于大表,使用增量收集减少开销
- 并行收集:对于大表,使用并行收集提高效率
- 采样收集:对于超大表,使用采样收集减少开销
- 直方图收集:对于数据分布不均匀的列,收集直方图信息
- 统计信息锁定:对于稳定的表,锁定统计信息避免频繁收集
更多学习教程公众号风哥教程itpux_com
2.3 统计信息维护建议
统计信息维护的建议:
- 监控统计信息:定期监控统计信息的状态和准确性
- 验证统计信息:验证统计信息的准确性,确保优化器做出正确的决策
- 调整收集参数:根据表的特点调整收集参数,如采样率、并行度等
- 处理过期统计信息:及时更新过期的统计信息
- 使用统计信息 advisor:利用统计信息 advisor提供的建议
- 备份统计信息:在收集新的统计信息前备份旧的统计信息,以便需要时恢复
from oracle:www.itpux.com
Part03-生产环境项目实施方案
在生产环境中实施统计信息收集的实施方案:
- 需求分析:分析数据库的表结构和数据变化情况。
- 制定策略:根据表的大小和变化频率制定收集策略。
- 配置参数:配置统计信息收集的参数,如采样率、并行度等。
- 测试验证:在测试环境中测试收集策略的效果。
- 部署实施:在生产环境中部署收集策略。
- 监控维护:定期监控统计信息的状态和准确性。
- 调整优化:根据实际情况调整收集策略。
Part04-生产案例与实战讲解
4.1 手动收集统计信息
示例:手动收集统计信息
CREATE TABLE fgedu_employees (
emp_id NUMBER PRIMARY KEY,
emp_name VARCHAR2(100),
emp_dept VARCHAR2(50),
emp_salary NUMBER,
hire_date DATE
);/– 插入示例数据
INSERT INTO fgedu_employees VALUES (1001, ‘风哥1号’, ‘技术部’, 5000, SYSDATE – 365);INSERT INTO fgedu_employees VALUES (1002, ‘风哥2号’, ‘市场部’, 6000, SYSDATE – 180);INSERT INTO fgedu_employees VALUES (1003, ‘风哥3号’, ‘技术部’, 5500, SYSDATE – 90);INSERT INTO fgedu_employees VALUES (1004, ‘赵六’, ‘市场部’, 6500, SYSDATE – 60);INSERT INTO fgedu_employees VALUES (1005, ‘孙七’, ‘财务部’, 5800, SYSDATE – 30);– 插入更多数据
BEGIN
FOR i IN 1006 .. 10000 LOOP
INSERT INTO fgedu_employees VALUES (
i,
‘员工’ || TO_CHAR(i),
CASE MOD(i, 3)
WHEN 0 THEN ‘技术部’
WHEN 1 THEN ‘市场部’
ELSE ‘财务部’
END,
5000 + MOD(i, 2000),
SYSDATE – MOD(i, 365)
);END LOOP;COMMIT;END;/– 手动收集表统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(
ownname => ‘SYS’,
tabname => ‘FGEDU_EMPLOYEES’,
estimate_percent => 100,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO’,
degree => 4,
cascade => TRUE
);– 收集指定列的统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(
ownname => ‘SYS’,
tabname => ‘FGEDU_EMPLOYEES’,
estimate_percent => 100,
method_opt => ‘FOR COLUMNS emp_dept SIZE 10, emp_salary SIZE 254’,
degree => 4
);– 收集模式级统计信息
EXEC DBMS_STATS.GATHER_SCHEMA_STATS(
ownname => ‘SYS’,
estimate_percent => 100,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO’,
degree => 4,
cascade => TRUE
);– 收集数据库级统计信息
EXEC DBMS_STATS.GATHER_DATABASE_STATS(
estimate_percent => 100,
method_opt => ‘FOR ALL COLUMNS SIZE AUTO’,
degree => 4,
cascade => TRUE
);– 查看表统计信息
SELECT table_name, num_rows, blocks, last_analyzed
FROM user_tables
WHERE table_name = ‘FGEDU_EMPLOYEES’;– 查看列统计信息
SELECT column_name, num_distinct, low_value, high_value, last_analyzed
FROM user_tab_col_statistics
WHERE table_name = ‘FGEDU_EMPLOYEES’;
TABLE_NAME NUM_ROWS BLOCKS LAST_ANALYZED
————— ———- ———- ————- —————
FGEDU_EMPLOYEES 10000 134 2026-04-01 10:00:00
— 查看列统计信息
COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE LAST_ANALYZED
————— ———— ———————— ———————— ————- —————
EMP_ID 10000 000000000000000000000000 000000000000000000000000 2026-04-01 10:00:00
EMP_NAME 10000 73796731303031 73796739393939 2026-04-01 10:00:00
EMP_DEPT 3 626820e983b29c4a 756e6976657273697479 2026-04-01 10:00:00
EMP_SALARY 2000 000000000000000000000000 000000000000000000000000 2026-04-01 10:00:00
HIRE_DATE 365 78660c1e 78670c1e 2026-04-01 10:00:00
更多视频教程www.fgedu.net.cn
4.2 自动收集统计信息
示例:自动收集统计信息
SELECT * FROM dba_scheduler_jobs WHERE job_name LIKE ‘%GATHER_STATS%’;– 查看自动统计信息收集任务的状态
SELECT * FROM dba_scheduler_job_run_details WHERE job_name LIKE ‘%GATHER_STATS%’ ORDER BY log_date DESC;– 启用自动统计信息收集任务
EXEC DBMS_SCHEDULER.ENABLE(‘SYS.GATHER_STATS_JOB’);– 禁用自动统计信息收集任务
EXEC DBMS_SCHEDULER.DISABLE(‘SYS.GATHER_STATS_JOB’);– 修改自动统计信息收集任务的调度
EXEC DBMS_SCHEDULER.SET_ATTRIBUTE(
‘SYS.GATHER_STATS_JOB’,
‘repeat_interval’,
‘FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0’
);– 手动运行自动统计信息收集任务
EXEC DBMS_SCHEDULER.RUN_JOB(‘SYS.GATHER_STATS_JOB’);– 查看自动统计信息收集的配置
SELECT * FROM dba_autotask_client WHERE client_name = ‘auto optimizer stats collection’;– 查看自动统计信息收集的窗口
SELECT * FROM dba_scheduler_windows WHERE window_name LIKE ‘%WINDOW%’;
JOB_NAME JOB_ACTION ENABLED
—————————————- ——————————————————————————– ——–
GATHER_STATS_JOB sys.dbms_stats.gather_database_stats_job_proc TRUE
— 查看自动统计信息收集任务的状态
LOG_ID JOB_NAME STATUS ERROR# LOG_DATE
———————————– —————- ——- —— ————- —————
12345678901234567890123456789012 GATHER_STATS_JOB SUCCESS 0 2026-04-01 02:00:00
— 查看自动统计信息收集的窗口
WINDOW_NAME RESOURCE_PLAN DURATION
—————————— ————————— ——————————
MONDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 04:00:00
TUESDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 04:00:00
WEDNESDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 04:00:00
THURSDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 04:00:00
FRIDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 04:00:00
SATURDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 20:00:00
SUNDAY_WINDOW DEFAULT_MAINTENANCE_PLAN +000 20:00:00
学习交流加群风哥微信: itpux-com
4.3 统计信息分析与验证
示例:统计信息分析与验证
SELECT table_name, num_rows, blocks, avg_row_len
FROM user_tables
WHERE table_name = ‘FGEDU_EMPLOYEES’;– 验证表的实际行数
SELECT COUNT(*) FROM fgedu_employees;– 查看统计信息的详细信息
SELECT * FROM user_tab_statistics WHERE table_name = ‘FGEDU_EMPLOYEES’;– 查看列统计信息的详细信息
SELECT * FROM user_tab_col_statistics WHERE table_name = ‘FGEDU_EMPLOYEES’;– 查看直方图信息
SELECT * FROM user_tab_histograms WHERE table_name = ‘FGEDU_EMPLOYEES’;– 备份统计信息
EXEC DBMS_STATS.EXPORT_TABLE_STATS(
ownname => ‘SYS’,
tabname => ‘FGEDU_EMPLOYEES’,
stattab => ‘STATS_BACKUP’,
statid => ‘FGEDU_EMPLOYEES_20260401’
);– 恢复统计信息
EXEC DBMS_STATS.IMPORT_TABLE_STATS(
ownname => ‘SYS’,
tabname => ‘FGEDU_EMPLOYEES’,
stattab => ‘STATS_BACKUP’,
statid => ‘FGEDU_EMPLOYEES_20260401’
);– 锁定统计信息
EXEC DBMS_STATS.LOCK_TABLE_STATS(‘SYS’, ‘FGEDU_EMPLOYEES’);– 解锁统计信息
EXEC DBMS_STATS.UNLOCK_TABLE_STATS(‘SYS’, ‘FGEDU_EMPLOYEES’);– 删除统计信息
EXEC DBMS_STATS.DELETE_TABLE_STATS(‘SYS’, ‘FGEDU_EMPLOYEES’);
TABLE_NAME NUM_ROWS BLOCKS AVG_ROW_LEN
————— ———- ———- ———–
FGEDU_EMPLOYEES 10000 134 71
— 验证表的实际行数
COUNT(*)
———-
10000
— 查看统计信息的详细信息
TABLE_NAME PARTITION_NAME SUBPARTITION_NAME OBJECT_TYPE STALE_STATS NUM_ROWS BLOCKS AVG_ROW_LEN SAMPLE_SIZE LAST_ANALYZED
————— ——————– ——————– ———— ———– ———- ———- ———– ———– ————- —————
FGEDU_EMPLOYEES TABLE NO 10000 134 71 10000 2026-04-01 10:00:00
— 查看列统计信息的详细信息
TABLE_NAME COLUMN_NAME NUM_DISTINCT LOW_VALUE HIGH_VALUE DENSITY NUM_NULLS SAMPLE_SIZE LAST_ANALYZED
————— ————— ———— ———————— ———————— ———- ———- ———– ————- —————
FGEDU_EMPLOYEES EMP_ID 10000 000000000000000000000000 000000000000000000000000 0 0 10000 2026-04-01 10:00:00
FGEDU_EMPLOYEES EMP_NAME 10000 73796731303031 73796739393939 .0001 0 10000 2026-04-01 10:00:00
FGEDU_EMPLOYEES EMP_DEPT 3 626820e983b29c4a 756e6976657273697479 .3333 0 10000 2026-04-01 10:00:00
FGEDU_EMPLOYEES EMP_SALARY 2000 000000000000000000000000 000000000000000000000000 .0005 0 10000 2026-04-01 10:00:00
FGEDU_EMPLOYEES HIRE_DATE 365 78660c1e 78670c1e .0027 0 10000 2026-04-01 10:00:00
学习交流加群风哥QQ113257174
Part05-风哥经验总结与分享
风哥提示:在进行统计信息收集时,应注意以下几点:
- 定期收集统计信息:定期收集统计信息,确保统计信息的准确性。
- 选择合适的收集方法:根据表的大小和变化频率选择合适的收集方法,如增量收集、并行收集等。
- 调整收集参数:根据表的特点调整收集参数,如采样率、并行度等,以提高收集效率。
- 收集直方图信息:对于数据分布不均匀的列,收集直方图信息,帮助优化器做出更准确的决策。
- 监控统计信息:定期监控统计信息的状态和准确性,及时发现和解决问题。
- 备份统计信息:在收集新的统计信息前备份旧的统计信息,以便需要时恢复。
- 锁定统计信息:对于稳定的表,锁定统计信息避免频繁收集,减少开销。
- 使用自动收集:启用自动统计信息收集任务,确保统计信息的及时更新。
- 验证统计信息:定期验证统计信息的准确性,确保优化器做出正确的决策。
- 结合执行计划分析:结合执行计划分析,评估统计信息对执行计划的影响。
更多学习教程公众号风哥教程itpux_com
from oracle:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
