今天要给一张日志表(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
大表操做时尽可能选择空闲时间开发