最快方式是执行select * from table(dbms_space.asa_recommendations('false','false','false')),返回最近一次自动运行建议,关键看reclaimable_space字段:<1mb不值得收缩,>10mb才需跟进;权限不足会报ora-00904。
segment advisor 不会自动执行收缩,它只告诉你“哪里能 shrink”,且必须主动查视图才能看到结果。
怎么快速确认 Segment Advisor 有没有给出有效建议
最轻量、最常用的方式是直接调用 dbms_space.asa_recommendations:
- 执行
SELECT * FROM TABLE(dbms_space.asa_recommendations('FALSE','FALSE','FALSE'));—— 返回最近一次自动运行的建议(不含手动任务) - 三个参数含义:
'FALSE'表示不查全部历史、不包含手动任务、不只显示问题(即返回完整建议含 SQL) - 关键字段是
RECLAIMABLE_SPACE:小于 1MB 基本不值得 shrink;大于 10MB 才建议跟进 - 常见报错
ORA-00904: "DBMS_SPACE"."ASA_RECOMMENDATIONS": invalid identifier,说明当前用户缺少EXECUTE权限 onDBMS_SPACE,需 DBA 显式授权
为什么查 dba_advisor_findings 经常为空
这个视图只记录“真有空间可回收”的对象,不是所有分析过的段都会写入:
- 先确认任务是否成功完成:
SELECT task_name, status FROM dba_advisor_executions WHERE status = 'COMPLETED'; - 自动任务名通常带
auto space advisor前缀;手动任务名是你自己指定的,比如'BIG_TABLE Advice' - 再用该
task_id关联dba_advisor_findings:SELECT message, more_info FROM dba_advisor_findings WHERE task_id = 357; -
more_info字段里会明确写出推荐语句,例如ALTER TABLE scott.t_test01 SHRINK SPACE;,但不会帮你检查ROW MOVEMENT是否已启用
执行建议前必须验证的三件事
即使 Segment Advisor 显示可回收 20MB,直接跑 SHRINK SPACE 仍可能失败或无效:
- 表空间必须是本地管理(
EXTENT MANAGEMENT LOCAL)且启用了 ASSM(SEGMENT SPACE MANAGEMENT AUTO)—— 查dba_tablespaces确认 - 目标表必须已启用行移动:
ALTER TABLE scott.t_test01 ENABLE ROW MOVEMENT;,否则SHRINK SPACE报ORA-10636 - 如果表上有函数索引、域索引或 IOT 的 overflow 段,
SHRINK SPACE可能不支持,此时得改用MOVE或DBMS_REDEFINITION
OEM 里点 “Fix It” 为什么有时不可用
OEM 的界面看似傻瓜化,但受限于上下文和权限配置:
- 默认只显示过去 7 天的建议,若没看到预期结果,先查
DBA_AUTO_SEGADV_SUMMARY的END_TIME是否在近期 - “Fix It” 按钮生成的语句会自动加
SHRINK SPACE COMPACT,但不会处理依赖索引——你得单独对每个索引执行ALTER INDEX ... REBUILD ONLINE - 如果表属于
SYS、SYSTEM或其它 Oracle 内部用户,OEM 默认屏蔽操作入口,只能手工执行
真正容易被忽略的是:SHRINK SPACE 不会重排索引叶节点顺序,也不会修复索引块内的空闲空间;表收缩后,索引碎片往往更突出,必须同步评估并重建。











