Oracle 23C 实时统计功能新特性

来源:这里教程网 时间:2026-03-03 21:40:29 作者:

场景模拟

    有一个高频更新的表  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 参数优化统计收集效率。

相关推荐