oracle – 从v $datafile中查找表名.名字c??olum
当您查看等待事件(即使用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 解决方法我们来谈谈文件,块,段和范围.段是存储的数据库对象.它可以是表,索引,(子)分区,集群或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中进行选择,看看你是否有这样的文件.如果没有,并且您只获得了一些文件,请查看所有与ext.block_id和ext.block_id ext.blocks – 1之间的“10711”匹配的对象,而不包含文件ID.你应该能够从那里找到一个可能的候选人. 例外是如果问题出在临时段上.由于这些在操作结束时被处理掉,因此没有记录永久物体.在这种情况下,表/索引的“名称”不适用,您需要以另一种方式解决任何性能问题(例如,查看SQL及其解释计划,并确定使用大量临时空间是否正确) . (编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |