Oracle没有DBA_SEGMENT_ADVISOR_RESULTS视图,因其结果实际存于DBA_ADVISOR_TASKS、DBA_ADVISOR_FINDINGS和DBA_ADVISOR_RECOMMENDATIONS等标准顾问视图中,而非按“Segment”命名的专用视图。
oracle 没有 dba_segment_advisor_results 这个视图,直接查会报 ora-00942 错误。
为什么查不到 DBA_SEGMENT_ADVISOR_RESULTS?
Oracle 的 Segment Advisor 是一个可选的自动任务,运行后结果存放在 DBA_ADVISOR_* 系列视图中,而非以 “SEGMENT” 命名的独立视图。常见误区是把顾问名称(Segment Advisor)和视图名混淆了。
实际可用的关键视图是:
-
DBA_ADVISOR_TASKS:确认 Segment Advisor 任务是否执行过 -
DBA_ADVISOR_FINDINGS:查看具体发现,message字段含“reclaimable space”或“shrink”提示即为碎片建议 -
DBA_ADVISOR_RECOMMENDATIONS:对应每条发现的修复语句,如ALTER TABLE ... SHRINK SPACE
怎么快速确认当前是否有有效碎片建议?
执行以下查询(需 DBA 权限):
SELECT t.task_name,
f.impact,
f.message,
r.command,
r.attr1 AS object_owner,
r.attr2 AS object_name,
r.attr3 AS object_type
FROM dba_advisor_tasks t
JOIN dba_advisor_findings f ON t.task_id = f.task_id
JOIN dba_advisor_recommendations r ON f.finding_id = r.finding_id
WHERE t.advisor_name = 'Segment Advisor'
AND f.impact > 10
AND r.command LIKE '%SHRINK%';
注意点:
- 若无返回,不代表没碎片,只说明 Segment Advisor 近期未运行或未触发高影响建议
- 该顾问默认不自动启用;手动运行需先执行
DBMS_ADVISOR.TUNE_MVIEW或调用DBMS_SPACE.ASA_RECOMMENDATIONS(12c+) - 它对 ASSM 表空间中因大量 DELETE 导致的 HWM 悬空较敏感,但对
DBA_FREE_SPACE中的小 extent 分散不敏感
比查视图更可靠的碎片检测方式有哪些?
依赖 DBA_ADVISOR_* 视图容易漏判。生产环境应交叉验证:
- 查高水位线浪费:
SELECT table_name, ROUND((blocks * 8) / 1024, 2) hwm_mb, ROUND((num_rows * avg_row_len) / 1024 / 1024, 2) data_mb FROM user_tables WHERE blocks > 1000 AND num_rows > 0 AND (blocks * 8) / 1024 > 500—— 若hwm_mb远大于data_mb,说明空间未回收 - 查行迁移/链接:
SELECT table_name, chain_cnt FROM user_tables WHERE chain_cnt > 0—— 链式行多,物理读必然上升 - 查空闲区分布:
SELECT tablespace_name, COUNT(*) extents, ROUND(SUM(bytes)/1024/1024, 2) free_mb FROM dba_free_space GROUP BY tablespace_name HAVING COUNT(*) > 1000 AND SUM(bytes) > 1024*1024*100—— 大量小空闲块是典型碎片信号
真正要动手整理前,必须确认 AWR 中 db file sequential read 平均等待 >15ms 且 Physical Reads / Logical Reads > 0.15。否则只是“看起来乱”,实际不影响性能。











