首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从v$datafile中查找表名。名称列

从v$datafile中查找表名。名称列
EN

Stack Overflow用户
提问于 2011-08-06 04:34:23
回答 1查看 7.9K关注 0票数 3

当您查看等待事件(即Toad)时,您会看到file#参数。如何获取更多有用的信息作为表名。

甚至可以知道该表读取的记录数吗?

在另一个论坛上,我找到了这个建议,但它似乎不起作用。

代码语言:javascript
复制
select segment_name
from dba_extents ext
where ext.file_id = 828
            and 10711 between ext.block_id and ext.block_id + ext.blocks - 1
            and rownum = 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-06 10:36:18

让我们来谈谈文件、块、段和区段。

段是存储的数据库对象。它可以是表、索引、(子)分区、集群或LOB。大多数情况下,您会对表和索引感兴趣。

段由区段组成。如果你把一个片段想象成一本书,那么一个范围就是一个章节。一个段(通常)至少从一个区段开始。当它需要存储更多数据,并且在现有区段中没有空间时,它会向段中添加另一个区段。

区段位于数据文件中。数据文件可以有许多区段,每个区段都从文件中的不同位置开始,并具有一定的大小。从文件1的块10开始,您可能有一个包含15个块的扩展区。

等待事件应标识文件和数据块(以及行)。如果您的等待事件针对的是文件#1和块12,则转到USER_EXTENTS (或DBA_EXTENTS)并在file# 1中查找盘区,其中12位于起始块位置和起始块位置之间加上块数。因此,块12将在开始块10和结束块25之间(开始加大小)。

一旦确定了区段,就可以追踪到它的父段(USER_SEGMENTS / DBA_SEGMENTS),这将为您提供表/索引名称。

理论上的SQL如下:

代码语言:javascript
复制
select username, sid, serial#, 
       row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#,
       ext.*
from v$session s
     join dba_extents ext on ext.file_id = row_wait_file#
     and row_wait_block# between ext.block_id and ext.block_id + ext.blocks - 1
where username = 'HR'
and status = 'ACTIVE'

对于这一次,我故意阻塞了一个会话,以便它等待一个行锁。

828是一个相当大的文件id。这并不是不可能的,但这是不寻常的。从DBA_DATA_FILES中进行选择,看看是否有这样的文件。如果不是,并且您只有几个文件,请查看所有符合"10711 between ext.block_id and ext.block_id + ext.blocks - 1“条件但没有文件id的对象。你应该能够从那里找到一个可能的候选人。

例外情况是,如果问题发生在临时网段上。由于这些对象在操作结束时被释放,因此没有记录永久对象。在这种情况下,表/索引的“名称”不适用,您需要以另一种方式解决任何性能问题(例如,查看SQL及其解释计划,并确定使用大量临时空间是否正确)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6962305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档