今天要給一張日誌表(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
大表操做時儘可能選擇空閒時間開發