大表創建索引引起enq: TX - row lock contention等待

今天要給一張日誌表(6000w數據)創建索引,致使生產系統行鎖部分功能卡住sql

create index idx_tb_cid on tb_login_log(user_id);session

開始執行後大概花費了20分鐘spa

中途功能卡住沒法使用日誌

SQL> select sid,event from v$session_wait where event='enq: TX - row lock contention';

       SID EVENT
---------- ----------------------------------------------------------------
         2 enq: TX - row lock contention
         4 enq: TX - row lock contention
         7 enq: TX - row lock contention
         8 enq: TX - row lock contention
        12 enq: TX - row lock contention
        14 enq: TX - row lock contention
 .....省略

111 rows selected.

隨機取幾個sid查看語句code

SQL> @getsqlbysid   
Enter value for sid: 271
old   1: select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.sid='&sid') order by piece asc
new   1: select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.sid='271') order by piece asc

SQL_TEXT
----------------------------------------------------------------
UPDATE TB_LOGIN_01 SET USER_ID = :USER_ID, ga
L_DATE = sysdate WHERE USER_ID = :"SYS_B_0" A
ND CP_GD_ID = :CP_GD_ID AND (P_ID is nu
ll OR P_ID = :"SYS_B_1" OR P_ID = :P_ID) AN
D (W_USED IS NULL OR W_USED = :"SYS_B_2") AND rownum
 < :"SYS_B_3"

6 rows selected.

SQL> /277
Enter value for sid: 277
old   1: select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.sid='&sid') order by piece asc
new   1: select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.sid='277') order by piece asc

SQL_TEXT
----------------------------------------------------------------
UPDATE TB_LOGIN_01 SET USER_ID = :USER_ID, ga
L_DATE = sysdate WHERE USER_ID = :"SYS_B_0" A
ND CP_GD_ID = :CP_GD_ID AND (P_ID is nu
ll OR P_ID = :"SYS_B_1" OR P_ID = :P_ID) AN
D (W_USED IS NULL OR W_USED = :"SYS_B_2") AND rownum
 < :"SYS_B_3"

6 rows selected.

SQL> /
Enter value for sid: 272
old   1: select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.sid='&sid') order by piece asc
new   1: select sql_text from v$sqltext a where a.hash_value=(select sql_hash_value from v$session b where b.sid='272') order by piece asc

SQL_TEXT
----------------------------------------------------------------
UPDATE TB_LOGIN_01 SET USER_ID = :USER_ID, ga
L_DATE = sysdate WHERE USER_ID = :"SYS_B_0" A
ND CP_GD_ID = :CP_GD_ID AND (P_ID is nu
ll OR P_ID = :"SYS_B_1" OR P_ID = :P_ID) AN
D (W_USED IS NULL OR W_USED = :"SYS_B_2") AND rownum
 < :"SYS_B_3"

發現並不是正在建立的索引表建立的行鎖,與開發瞭解得知,這些被鎖的表都是一個事務中的其中一條語句blog

而同一個事務中用到的最後一條語句正是使用了正在建立索引的表索引

結論:事務

大表操做時瞭解清楚業務邏輯、用途ci

大表操做時儘可能選擇空閒時間開發

相關文章
相關標籤/搜索