从v $ datafile中查找表名。名字c​​olum

时间:2011-08-05 20:34:23

标签: oracle oracle10g

当您查看等待事件(即使用Toad)时,您会看到一个文件#参数。 如何以表名的形式获得更多有用的信息。

是否可以知道该表读取的记录数量?

在另一个论坛中我发现了这个建议,但似乎没有用。

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

1 个答案:

答案 0 :(得分:7)

让我们谈谈文件,块,片段和范围。

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

段由范围组成。如果您将某个细分作为一本书,那么范围就是一个章节。段(通常)以至少一个范围开始。当需要存储更多数据并且在现有范围内没有空间时,它会为该段添加另一个范围。

范围存在于数据文件中。数据文件可以有许多范围,每个范围从文件中的不同点开始并具有大小。在块10中,您可以从文件1开始有一个15个块的范围。

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

一旦确定了范围,就会将其追溯到其父段(USER_SEGMENTS / DBA_SEGMENTS),这将为您提供表/索引名称。


理论SQL如下:

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及其解释计划,并确定使用大量临时空间是否正确)