Oracle 21c 常见视图及用法
面向 Oracle DBA 的 21c 常用数据字典与动态性能视图速查。涵盖对象/空间/会话/SQL/日志等典型场景的查询范式与实战示例。
提示与前提: - CDB 架构:在 CDB$ROOT 与各 PDB 中相同视图的含义不同。跨容器使用 CDB_/CONTAINER_DATA 设置,或在每个 PDB 内分别查询。 - 访问权限:DBA_ 需具备相应权限;V$/GV$ 通常需要 SELECT ANY DICTIONARY 或 SELECT_CATALOG_ROLE。 - RAC 环境:使用 GV$* 跨实例汇总(含 INST_ID)。
1. 视图族谱速览
- USER_*:当前用户可见对象(不用 DBA 权限)
- ALL_*:当前用户可访问对象
- DBA_*:数据库级对象/元数据(需 DBA 权限)
- V$ / GV$:动态性能视图(实例级/集群级)
- CDB_*:容器字典视图(CDB 架构)
2. 对象与分区
- 表/索引/约束/统计信息
-- 查找指定模式的大表(按段大小)
SELECT owner, segment_name, segment_type, bytes/1024/1024 AS mb
FROM dba_segments
WHERE owner = 'APP'
AND segment_type = 'TABLE'
ORDER BY bytes DESC FETCH FIRST 20 ROWS ONLY;
-- 表分区信息
SELECT table_owner, table_name, partition_name, high_value, num_rows
FROM dba_tab_partitions
WHERE table_owner = 'APP'
ORDER BY table_name, partition_position;
-- 索引与可用性
SELECT owner, index_name, table_name, status, uniqueness
FROM dba_indexes
WHERE owner = 'APP' AND table_name = 'ORDERS';
3. 表空间与数据文件/剩余空间
-- 表空间使用率(小文件表空间)
SELECT df.tablespace_name,
ROUND(SUM(df.bytes)/1024/1024) AS total_mb,
ROUND(SUM(fs.bytes)/1024/1024) AS free_mb,
ROUND( (SUM(df.bytes)-SUM(fs.bytes))*100 / NULLIF(SUM(df.bytes),0), 2) AS used_pct
FROM dba_data_files df
LEFT JOIN (
SELECT tablespace_name, SUM(bytes) bytes FROM dba_free_space GROUP BY tablespace_name
) fs ON df.tablespace_name = fs.tablespace_name
GROUP BY df.tablespace_name
ORDER BY used_pct DESC;
-- 数据文件明细(含自增)
SELECT file_id, file_name, tablespace_name,
bytes/1024/1024 AS mb,
autoextensible, increment_by
FROM dba_data_files
ORDER BY tablespace_name, file_id;
-- 临时表空间与 tempfile
SELECT file_id, file_name, tablespace_name, bytes/1024/1024 AS mb
FROM dba_temp_files;
4. 会话/锁/阻塞
-- 当前会话与等待(会话级)
SELECT s.sid, s.serial#, s.username, s.status, s.machine,
s.event, s.wait_class, s.seconds_in_wait
FROM v$session s
WHERE s.type = 'USER'
ORDER BY s.seconds_in_wait DESC FETCH FIRST 30 ROWS ONLY;
-- 阻塞关系(找出 blocker 与被阻塞者)
SELECT /*+ RULE */
s1.sid AS blocker_sid, s1.serial# AS blocker_serial, s1.username AS blocker_user,
s2.sid AS waiter_sid, s2.serial# AS waiter_serial, s2.username AS waiter_user,
l1.type, l1.id1, l1.id2
FROM v$lock l1
JOIN v$session s1 ON s1.sid = l1.sid
JOIN v$lock l2 ON l2.id1 = l1.id1 AND l2.id2 = l1.id2 AND l2.block = 0
JOIN v$session s2 ON s2.sid = l2.sid
WHERE l1.block = 1;
-- 杀会话(谨慎):
ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE; -- 单实例
-- RAC:可加 @inst_id:'sid,serial#,@inst_id'
5. SQL 热点与执行统计
-- TOP SQL(逻辑读)
SELECT sql_id, plan_hash_value, buffer_gets, executions, parsing_schema_name,
substr(sql_text,1,80) AS sql_sample
FROM v$sqlarea
WHERE buffer_gets > 0
ORDER BY buffer_gets DESC FETCH FIRST 20 ROWS ONLY;
-- 最近高耗资源 SQL(ASH,需诊断许可)
SELECT sql_id, session_state, wait_class,
COUNT(*) AS samples
FROM v$active_session_history
WHERE sample_time > SYSTIMESTAMP - INTERVAL '10' MINUTE
GROUP BY sql_id, session_state, wait_class
ORDER BY samples DESC FETCH FIRST 20 ROWS ONLY;
6. 日志/归档/FRA 与数据库状态
-- 实例与数据库
SELECT instance_name, status, database_status FROM v$instance;
SELECT name, dbid, open_mode, cdb FROM v$database;
-- 联机重做日志
SELECT group#, thread#, bytes/1024/1024 AS mb, members, status
FROM v$log ORDER BY group#;
SELECT group#, member FROM v$logfile ORDER BY group#, member;
-- 归档日志与 FRA 使用
SELECT dest_name, status, target, archived_seq# FROM v$archive_dest;
SELECT name, space_limit/1024/1024 AS limit_mb, space_used/1024/1024 AS used_mb
FROM v$recovery_file_dest;
7. 参数与环境
-- 参数(模糊)
SELECT name, value FROM v$parameter WHERE LOWER(name) LIKE '%pga%';
SELECT name, display_value FROM v$parameter WHERE name IN ('db_block_size','compatible');
-- PDB 列表/当前容器
SELECT con_id, name, open_mode FROM v$containers ORDER BY con_id;
SHOW con_name; -- SQL*Plus/SQLcl
8. 常用排障清单(按视图定位)
- 空间问题:dba_data_files, dba_free_space, dba_segments
- 索引问题:dba_indexes, dba_ind_columns, v$sql_plan
- 锁等待:v$session, v$lock, dba_waiters, dba_blockers(若有)
- 性能热点:v$sqlarea, v$active_session_history, v$sysstat
- 日志/FRA:v$log, v$logfile, v$archived_log, v$recovery_file_dest
- 容器/CDB:cdb_* 视图,v$containers
提示:在生产环境执行查询请附带限定条件(owner/schema/time range),避免全库扫描带来额外负载。