当您查看等待事件(即Toad)时,您会看到file#参数。如何获取更多有用的信息作为表名。
甚至可以知道该表读取的记录数吗?
在另一个论坛上,我找到了这个建议,但它似乎不起作用。
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发布于 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如下:
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及其解释计划,并确定使用大量临时空间是否正确)。
https://stackoverflow.com/questions/6962305
复制相似问题