场景模拟
有一个高频更新的表
sales,需要确保统计信息实时准确,以优化执行计划。传统方法需手动或定时收集统计信息,而 Oracle 23C 的实时统计功能通过自动监控数据变化并动态调整统计信息,减少人工干预。
环境准备
Oracle 23C 数据库(需启用实时统计相关参数)。
测试表
sales:
CREATE TABLE sales ( sale_id NUMBER PRIMARY KEY, product_id NUMBER, sale_date DATE, amount NUMBER );
步骤1:启用实时统计功能
Oracle 23C 通过
DBMS_STATS 和隐式参数增强实时统计的自动化。需确保以下配置:
-- 启用实时统计自动收集
ALTER SYSTEM SET STATISTICS_LEVEL = ALL;
-- 开启自动统计信息收集(默认已开启)
EXEC DBMS_STATS.SET_GLOBAL_PREFS('AUTO_STATS_JOB', 'TRUE');
-- 启用机器学习优化统计(23C新特性)
ALTER SYSTEM SET "_optimizer_use_ml_stats" = TRUE;
步骤2:模拟数据变化并观察统计更新
2.1 初始数据加载
-- 插入10万条初始数据 INSERT /*+ APPEND */ INTO sales SELECT LEVEL AS sale_id, MOD(LEVEL, 100) AS product_id, SYSDATE - MOD(LEVEL, 365) AS sale_date, DBMS_RANDOM.VALUE(100, 10000) AS amount FROM DUAL CONNECT BY LEVEL <= 100000; COMMIT;
2.2 手动触发统计信息收集(可选)
EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'SALES');
2.3 查询初始统计信息
SELECT table_name, num_rows, last_analyzed FROM user_tab_statistics WHERE table_name = 'SALES';
输出示例:
TABLE_NAME | NUM_ROWS | LAST_ANALYZED --------------------------------------- SALES | 100000 | 2025-03-06 10:00:00
步骤3:模拟实时数据变更
3.1 高频插入新数据
-- 插入5万条新数据 INSERT INTO sales SELECT 100000 + LEVEL AS sale_id, MOD(LEVEL, 200) AS product_id, SYSDATE AS sale_date, DBMS_RANDOM.VALUE(100, 5000) AS amount FROM DUAL CONNECT BY LEVEL <= 50000; COMMIT;
3.2 更新部分数据
UPDATE sales SET amount = amount * 1.1 WHERE sale_date >= TRUNC(SYSDATE) - 7; COMMIT;
步骤4:验证实时统计更新
4.1 查看统计信息变化
-- 查询最新统计信息(无需手动收集) SELECT table_name, num_rows, last_analyzed FROM user_tab_statistics WHERE table_name = 'SALES';
输出示例(自动更新后):
TABLE_NAME | NUM_ROWS | LAST_ANALYZED --------------------------------------- SALES | 150000 | 2025-03-06 10:05:00
4.2 检查列级统计信息
SELECT column_name, num_distinct, histogram FROM user_tab_col_statistics WHERE table_name = 'SALES';
输出示例(
amount
列直方图动态调整):
COLUMN_NAME | NUM_DISTINCT | HISTOGRAM --------------------------------------- AMOUNT | 4900 | HYBRID
步骤5:结合机器学习优化
Oracle 23C 通过机器学习预测数据分布变化,优化统计信息:
-- 查看机器学习优化的统计建议 SELECT report FROM TABLE(DBMS_STATS.REPORT_STATS_OPERATIONS( operations => 'AUTO_STATS', since => SYSDATE - 1 ));
输出示例:
OPERATION_TYPE | OBJECT_NAME | ML_OPTIMIZED ------------------------------------------- AUTO_STATS | SALES | YES
关键新特性说明
动态统计更新:
数据变更(INSERT/UPDATE/DELETE)后,统计信息自动增量更新,无需手动触发
GATHER_TABLE_STATS。
通过
DBA_TAB_MODIFICATIONS 视图监控数据变化量。
机器学习增强:
使用历史数据模式预测未来统计趋势,优化直方图类型(如 HYBRID 直方图)。
减少因统计信息滞后导致的执行计划偏差。
与执行计划联动:
实时统计信息直接影响 SQL 优化器,生成更精准的执行计划。
可通过
DBMS_XPLAN 查看优化器是否采用最新统计信息。
注意事项
性能开销:高频统计更新可能增加 CPU 负载,需平衡实时性与资源消耗。
参数兼容性:确保
COMPATIBLE 参数设置为
23.0.0 以启用全部新特性。
混合工作负载:OLTP 场景中建议结合
INCREMENTAL_STATS 参数优化统计收集效率。
