Oracle:在慢速表上提交挂起的事务

时间:2013-08-19 07:33:49

标签: oracle commit oracle-sqldeveloper

我有一个Oracle表,我尝试插入大量的记录(大约150M)。 我使用的是sqldeveloper,插入后我没有点击'commit'按钮。

现在这个表在任何操作上都很慢,但是如果我进行更新或计数,它会显示该表有0条记录。例如,所有记录的更新花了5个小时,它更新了0条记录。

所以我认为它之所以变慢是因为它上面有未提交的事务。如何对这些待处理交易提交任何内容? (初始插入后,SqlDeveloper已关闭并打开)。

3 个答案:

答案 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;