gpt4 book ai didi

oracle - 从 v$datafile 中查找表名。姓名栏

转载 作者:行者123 更新时间:2023-12-01 10:09:27 24 4
gpt4 key购买 nike

当您查看等待事件(即使用 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

最佳答案

让我们谈谈文件、 block 、段和范围。

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

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

范围存在于数据文件中。一个数据文件可以有很多范围,每个范围都从文件中的不同点开始并且有一个大小。从文件 1 的第 10 个 block 开始,您可能有一个 15 个 block 的范围。

等待事件应该标识文件和 block (和行)。如果您的等待事件是针对文件 #1 和 block 12 的,则您转到 USER_EXTENTS(或 DBA_EXTENTS)并查找文件 #1 中的范围,其中 12 在起始 block 位置和起始 block 位置加上 block 数之间。所以 block 12 将介于起始 block 10 和结束 block 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'

对于这个,我有意阻止了一个 session ,以便它等待行锁。

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

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

关于oracle - 从 v$datafile 中查找表名。姓名栏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6962305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com