如何用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
相关产品推荐
相关产品推荐

