You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用DBMS_STATS.set_table_prefs为同属主多分区表设Incremental为true

批量设置Oracle分区表的Incremental统计偏好为True

针对你有40-50张分区表需要统一设置Incremental统计参数为true的需求,我整理了一套高效的批量处理方案,不用手动逐个操作:

1. 先确认目标分区表列表

你提供的查询语句可以帮你精准筛选出指定用户下的所有分区表,先运行这条SQL确认表清单:

SELECT DISTINCT table_name, partitioning_type, subpartitioning_type, owner 
FROM all_part_tables 
WHERE owner = 'YOUR_USER_NAME'  -- 替换成实际的用户名
ORDER BY table_name ASC;

确保返回的表都是你需要修改的目标分区表。

2. 批量执行偏好设置的PL/SQL脚本

用PL/SQL游标循环自动处理所有目标表,避免重复劳动,同时捕获异常避免中断:

DECLARE
    v_owner VARCHAR2(30) := 'YOUR_USER_NAME';  -- 替换成实际用户名
    CURSOR c_part_tables IS
        SELECT DISTINCT table_name
        FROM all_part_tables
        WHERE owner = v_owner;
    v_table_name VARCHAR2(30);
BEGIN
    FOR rec IN c_part_tables LOOP
        BEGIN
            DBMS_STATS.SET_TABLE_PREFS(
                ownname => v_owner,
                tabname => rec.table_name,
                pname   => 'INCREMENTAL',
                pvalue  => 'TRUE'
            );
            DBMS_OUTPUT.PUT_LINE('成功设置表 ' || v_owner || '.' || rec.table_name || ' 的Incremental参数为TRUE');
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('设置表 ' || v_owner || '.' || rec.table_name || ' 失败: ' || SQLERRM);
        END;
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('批量操作完成');
END;
/

执行前记得把YOUR_USER_NAME替换成你的实际用户名,运行后可以通过DBMS_OUTPUT看到每张表的处理结果。

3. 验证设置是否生效

运行以下SQL检查所有分区表的Incremental参数状态:

SELECT owner, table_name, preference_name, preference_value
FROM all_tab_stat_prefs
WHERE owner = 'YOUR_USER_NAME'
  AND preference_name = 'INCREMENTAL'
ORDER BY table_name;

如果返回的preference_value都是TRUE,说明设置成功。

注意事项

  • 确保执行脚本的用户拥有DBMS_STATS的执行权限,以及对目标表的统计操作权限;
  • 如果存在子分区表,Incremental参数同样适用,脚本会自动包含这些表;
  • 这个参数设置后,后续收集统计信息时会采用增量方式,只收集有变化的分区,提升统计收集效率。

内容的提问来源于stack exchange,提问作者user9766188

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:40:35