我有一个Oracle表,我尝试插入大量的记录(大约150M)。 我使用的是sqldeveloper,插入后我没有点击'commit'按钮。
现在这个表在任何操作上都很慢,但是如果我进行更新或计数,它会显示该表有0条记录。例如,所有记录的更新花了5个小时,它更新了0条记录。
所以我认为它之所以变慢是因为它上面有未提交的事务。如何对这些待处理交易提交任何内容? (初始插入后,SqlDeveloper已关闭并打开)。
答案 0 :(得分:3)
您可能没有该表的索引,因此您必须运行全表扫描。 桌子的“高水印”向前推进。 尝试通过执行“alter table shrink space compact”来减小表的段上的大小。 或者您可以使用“老式”命令“alter table move”,但是这个命令将使表的索引无效,并且那些也必须重建。
注意:Oracle表不是自我整理碎片。
答案 1 :(得分:0)
如果您有必要的特权,可以使用
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给你任意锁定表,你可以杀死它们
答案 2 :(得分:0)
您的表格可能已被锁定,请从系统用户运行以下查询,以确定该表格上是否有任何锁定。
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;