如何查看对象在数据文件中的分布_DBA_EXTENTS与FILE_ID映射关系
DBA_EXTENTS的FILE_ID对应v$datafile.FILE_ID而非FILE#需用FILE_ID关联FILE_ID0表示临时段或undo延迟清理区应查v$tempfile而非v$datafile查询必须加OWNER和TABLESPACE_NAME过滤以提升性能。DBA_EXTENTS 里 FILE_ID 和实际数据文件对不上先查 v$datafiledba_extents 中的 file_id 是 oracle 内部编号不是操作系统文件序号也不等于 v$datafile.file#——它对应的是 v$datafile.file_id。很多人直接拿 dba_extents.file_id 去匹配 v$datafile.name 的顺序结果找不到文件就是因为混淆了 file# 和 file_id。正确做法是用 FILE_ID 字段做关联SELECT e.SEGMENT_NAME, e.FILE_ID, d.NAMEFROM DBA_EXTENTS eJOIN v$datafile d ON e.FILE_ID d.FILE_IDWHERE e.OWNER SCOTT AND e.SEGMENT_NAME EMP;FILE_ID 在 v$datafile 和 DBA_EXTENTS 中语义一致可直接等值连接FILE# 只在 v$datafile 里存在是控制文件中记录的“文件序号”重启后可能变动不能用于跨会话定位如果查询返回空先确认对象是否在本地管理表空间DBA_EXTENTS 不包含字典管理表空间的区信息想看某个对象所有区落在哪些物理文件上别漏掉分区和索引一个表可能有多个段主表段、LOB 段、索引段、分区段。只查 SEGMENT_NAME 等于表名会漏掉 INDEX 或 LOBINDEX 类型的区。更稳妥的方式是按 OWNER SEGMENT_NAME SEGMENT_TYPE 联合过滤并覆盖常见类型SELECT DISTINCT FILE_ID, BLOCK_ID, BLOCKS, SEGMENT_TYPEFROM DBA_EXTENTSWHERE OWNER SCOTT AND (SEGMENT_NAME EMP OR SEGMENT_NAME IN (SELECT INDEX_NAME FROM DBA_INDEXES WHERE TABLE_OWNER SCOTT AND TABLE_NAME EMP) OR SEGMENT_NAME IN (SELECT SEGMENT_NAME FROM DBA_LOBS WHERE OWNER SCOTT AND TABLE_NAME EMP));DBA_EXTENTS 按段segment组织不是按表table一个表可能对应多个段分区表的每个分区是独立段SEGMENT_NAME 是分区名不是表名需先查 DBA_TAB_PARTITIONS 获取分区名再 join如果对象在 UNDO 或 TEMP 表空间DBA_EXTENTS 仍会返回记录但对应文件是临时文件或回滚段文件v$datafile 查不到——得查 v$tempfile 或 v$rollnameDBA_EXTENTS 查询慢加 WHERE 条件必须带上 OWNER 和 TABLESPACE_NAMEDBA_EXTENTS 是动态性能视图底层扫描数据字典基表全表扫一次可能耗几秒甚至更久尤其在大库中。不加过滤条件直接查等于让 Oracle 扫描整个区分配历史。 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2510683.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!