代码改变世界

Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL

2026-09-10 07:19  AlfredZhao  阅读(87)  评论(0)    收藏  举报

在日常的 Oracle 开发与运维中,我们经常需要列出某个 Schema 下的“真实业务表”。但现实往往很骨感:只要库里启用过全文索引、物化视图、高级队列,甚至只是删过几张表,USER_TABLES 里就会混入一堆系统自动生成的辅助表。

笔者在整理清单时发现,仅靠过滤常见的 BIN$%(回收站)和 SYS_% 并不够。像外部表临时表 ET$%、空间索引 MDXT_% 这类前缀,仅在特定场景下出现,容易被遗漏。为此,笔者将新旧版本中所有系统辅助表前缀做了全量整合,整理出下面这份“最全排除 SQL”。

01 | 查 USER_TABLES(最全推荐版)

如果只需要当前用户下、且排除官方标记的二级表和嵌套表的业务表,推荐直接查 USER_TABLES

SELECT table_name 
FROM user_tables
WHERE 
  -- 1. 过滤官方标记的二级表与嵌套表
  (secondary IS NULL OR secondary = 'N')
  AND (nested IS NULL OR nested = 'NO')

  -- 2. 索引与内部特性辅助表
  AND table_name NOT LIKE 'DR$%'           -- 全文索引 (Oracle Text)
  AND table_name NOT LIKE 'VECTOR$%'      -- 23ai 向量索引 (HNSW/IVF)
  AND table_name NOT LIKE 'MDXT_%'         -- 空间索引 (Spatial Index)
  AND table_name NOT LIKE 'SYS_%'          -- 系统临时表 / LOB 表

  -- 3. 数据同步与高级特性表
  AND table_name NOT LIKE 'AQ$%'           -- 高级队列 (Advanced Queuing)
  AND table_name NOT LIKE 'MLOG$%'         -- 物化视图日志
  AND table_name NOT LIKE 'RUPD$%'         -- 物化视图更新日志
  AND table_name NOT LIKE 'ET$%'           -- 外部表 (External Table) 临时表
  AND table_name NOT LIKE 'DM$%'           -- Data Mining 数据挖掘模型表
  AND table_name NOT LIKE 'ANNOTATIONS_%'  -- 23ai 数据注解表

  -- 4. 开发工具与管理平台辅助表
  AND table_name NOT LIKE 'DBTOOLS$%'      -- Database Actions / ORDS 执行历史表
  AND table_name NOT LIKE 'SQLDEV$%'       -- SQL Developer 辅助表

  -- 5. 系统垃圾与回收站
  AND table_name NOT LIKE 'BIN$%'         -- 回收站表 (Recycle Bin)
  
  order by table_name;

02 | 查 USER_OBJECTS(全量过滤版)

如果想覆盖当前用户可见的所有对象,可以改用 user_objects 视图,比如最常见的,需要过滤出业务的表以及视图:

SELECT object_name AS table_name, object_type AS table_type
FROM user_objects
WHERE object_type IN ('TABLE', 'VIEW')
  -- 1. 过滤所有系统/后台标记为自动生成的对象
  AND generated = 'N'

  -- 2. 索引与内部特性辅助表(以防某些版本或场景下 generated 为 N)
  AND object_name NOT LIKE 'DR$%'           -- 全文索引 (Oracle Text)
  AND object_name NOT LIKE 'VECTOR$%'      -- 23ai 向量索引 (HNSW/IVF)
  AND object_name NOT LIKE 'MDXT_%'         -- 空间索引 (Spatial Index)
  AND object_name NOT LIKE 'SYS_%'          -- 系统临时表 / LOB 表

  -- 3. 数据同步、工具与高级特性表
  AND object_name NOT LIKE 'AQ$%'           -- 高级队列 (Advanced Queuing)
  AND object_name NOT LIKE 'MLOG$%'         -- 物化视图日志
  AND object_name NOT LIKE 'RUPD$%'         -- 物化视图更新日志
  AND object_name NOT LIKE 'ET$%'           -- 外部表 (External Table) 临时表
  AND object_name NOT LIKE 'DM$%'           -- Data Mining 数据挖掘模型表
  AND object_name NOT LIKE 'ANNOTATIONS_%'  -- 23ai 数据注解表

  -- 4. 开发工具与管理平台辅助表
  AND object_name NOT LIKE 'DBTOOLS$%'      -- Database Actions / ORDS 执行历史表
  AND object_name NOT LIKE 'SQLDEV$%'       -- SQL Developer 辅助表

  -- 5. 系统视图 & 回收站
  AND object_name NOT LIKE 'METADATA_%'     -- 23ai 元数据注解相关视图
  AND object_name NOT LIKE 'MVIEW_%'        -- 物化视图系统视图
  AND object_name NOT LIKE 'LOGMNR_%'       -- LogMiner 系统视图
  AND object_name NOT LIKE 'OLAP_%'         -- OLAP 特性系统视图
  AND object_name NOT LIKE 'BIN$%'         -- 数据库回收站 (Recycle Bin)

  order by table_type, table_name;

03 | 核心汇总对照清单

这份对照表可以直接保存为开发规范,方便日后排查:

过滤前缀 对应功能/模块 产生场景
DR$% 全文索引 (Oracle Text) 创建 CONTEXT 类型的全文索引
VECTOR$% AI 向量检索 (23ai) 创建 VECTOR 类型字段的 HNSW/IVF 索引
MDXT_% 空间索引 (Spatial Index) 创建 SDO_GEOMETRY 空间索引
SYS_% 系统底层/LOB段/临时表 表中包含 CLOB/BLOB 或在线重定义
AQ$% 高级队列 (Advanced Queuing) 使用 Oracle 内部消息队列
MLOG$% / RUPD$% 物化视图日志 (MView Log) 为表创建了增量刷新的物化视图日志
ET$% 外部表 (External Table) 访问外部文件时生成的临时控制表
DM$% 数据挖掘 / 机器学习 (OML) 在数据库内训练/运行 ML 模型
ANNOTATIONS_% 数据注解 (23ai) 给表或列添加元数据 Annotation
DBTOOLS$% / SQLDEV$% Web/客户端工具控制表 使用 ORDS、SQL Developer Web 等工具
BIN$% 数据库回收站 删表(DROP TABLE)后留在回收站的数据

按这份全量列表过滤后,可以覆盖绝大多数常见场景下的系统辅助表;但不同版本和特性可能引入新的前缀,且若业务表本身以 SYS_BIN$ 等开头也会被误过滤,请结合实际情况调整。当然,如果你发现还有漏网之鱼,欢迎补充,加到过滤列表中来。

关注我,和AI一起成长~