2013-08-19 39 views
1

我有一個Oracle表,我試圖插入大量的記錄(大約150M)。 我正在使用sqldeveloper,並且在插入後我沒有單擊'commit'按鈕。Oracle:在緩慢的表上提交掛起的事務

現在這個表在任何操作上都很慢,但是如果我執行更新或計數,它將顯示錶中有0條記錄。例如,所有記錄的更新耗時5小時,並更新0條記錄。

因此,我認爲它之所以慢是因爲它有未提交的交易。我如何提交這些待處理的交易? (SqlDeveloper在初始插入後已關閉並打開)。

+2

:你的sqldeveloper已關閉,這意味着你的會話已過期,這意味着所有的初始插入是回滾:(,沒有其他方式來檢索未完成的事務。嘗試新插入 –

+0

謝謝。爲什麼桌子這麼慢?顯然有什麼東西必須在那裏? –

+0

:什麼是表中的計數? –

回答

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讓你在表中的任何鎖,你可以殺了他們

+0

此查詢給了我一些結果,但我可以在這個列表中沒有看到指定的表 –

+0

這意味着你的表沒有鎖可能你在sql中有問題 – CanFil

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; 
+0

沒有鎖定表我也可以重命名錶 –

+0

檢查是否有任何觸發器正在那張桌子上工作。 – Dba

3

您可能沒有該表上的索引,因此您必須運行全表掃描。 表的「高水位」向前移動。 嘗試通過執行「alter table shrink space compact」來減小表段的大小。 或者您可以使用「老式」命令「alter table move」,但是這個將會使您的表索引失效,並且這些索引也必須重建。

注意:Oracle表不是自我碎片整理。

+0

你是糾正沒有索引。但有0記錄我的想法是計數應該很快。感謝您的建議。 –

+1

當您在該表中插入150M行Oracle擴展表的空間分配單元「SEGMENT」時。當我們的交易回滾時,這並沒有減少。由於沒有索引,Oracle不知道其中沒有行。每次訪問表格時必須掃描整個分段。 – ibre5041

+0

謝謝伊萬。它確實有道理。簡直就是輕便的轉儲桌子,並開始一個新的。 –