我有一个 Oracle 表,我试图在其中插入大量记录(大约 150M)。我使用的是 sqldeveloper,插入后我没有单击“提交”按钮。
现在该表在任何操作上都非常缓慢,但如果我进行更新或计数,它显示该表有 0 条记录。例如,更新所有记录需要 5 个小时,它更新了 0 条记录。
所以我认为它之所以慢是因为上面有未提交的事务。我如何提交这些待处理的交易?(SqlDeveloper 在初始插入后已关闭并打开)。
我有一个 Oracle 表,我试图在其中插入大量记录(大约 150M)。我使用的是 sqldeveloper,插入后我没有单击“提交”按钮。
现在该表在任何操作上都非常缓慢,但如果我进行更新或计数,它显示该表有 0 条记录。例如,更新所有记录需要 5 个小时,它更新了 0 条记录。
所以我认为它之所以慢是因为上面有未提交的事务。我如何提交这些待处理的交易?(SqlDeveloper 在初始插入后已关闭并打开)。
您可能在该表上没有索引,因此您必须运行全表扫描。并且表的“高水位”被向前移动了。尝试通过执行“alter table shrink space compact”来减小表段的大小。或者您可以使用“老式”命令“alter table move”,但这会使您的表的索引无效,并且这些索引也必须重建。
注意:Oracle 表不是自我碎片整理的。
如果您有必要的特权,您可以使用
select nvl(S.USERNAME,'Internal') username,
nvl(S.TERMINAL,'None') terminal,
L.SID||','||S.SERIAL# Kill,
U1.NAME||'.'||substr(T1.NAME,1,20) tab,
decode(L.LMODE,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) lmode,
decode(L.REQUEST,1,'No Lock',
2,'Row Share',
3,'Row Exclusive',
4,'Share',
5,'Share Row Exclusive',
6,'Exclusive',null) request
from V$LOCK L,
V$SESSION S,
SYS.USER$ U1,
SYS.OBJ$ T1
where L.SID = S.SID
and T1.OBJ# = decode(L.ID2,0,L.ID1,L.ID2)
and U1.USER# = T1.OWNER#
and S.TYPE != 'BACKGROUND'
order by 1,2,5
这个 sql 给你任何表中的锁,你可以杀死它们
您的表可能已被锁定,请从系统用户运行以下查询以查明该表是否有任何锁定。
select
object_name,
object_type,
session_id,
type, -- Type or system/user lock
lmode, -- lock mode in which session holds lock
request,
block,
ctime -- Time since current mode was granted
from
v$locked_object, all_objects, v$lock
where
v$locked_object.object_id = all_objects.object_id AND
v$lock.id1 = all_objects.object_id AND
v$lock.sid = v$locked_object.session_id
ORDER BY
session_id, ctime desc, object_name;