在日常的 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$ 等开头也会被误过滤,请结合实际情况调整。当然,如果你发现还有漏网之鱼,欢迎补充,加到过滤列表中来。
到此这篇关于Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL的文章就介绍到这了,更多相关Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!
