update tableA
set tableA.column1 = 'someValue'
where tableA.column2 in
( select column3 from tableB where tableB.column4 in
(
'valueA',
'valueB',
-- about 50 more records go here
)
)
当我运行它时,数据库似乎挂起了。我对sql很新,所以我想排除(或者更可能的规则)问题出现在我的陈述中的可能性。我使用sqlDeveloper在oracle数据库上运行它。
答案 0 :(得分:2)
当此更新正在运行(或“挂起”)时,请打开另一个会话并发出:
select event
from v$session
where sid = [sid_from_session_running_update]
看看它在做什么。 您可以通过发出此查询找到sid(当然,在更新“挂起”之前):
select distinct sid from v$mystat
只有你看到这样的事情:
SQL> select event
2 from v$session
3 where sid = 148
4 /
EVENT
----------------------------------------------------------------
enq: TX - row lock contention
1 row selected.
,是否是行锁的情况。您还可以使用其他一些v $视图来确定进一步发生的情况。例如,您可以反复查看v $ sess_io以查看是否正在进行任何进度。或者v $ session_longops或v $ sql_plan_statistics可能会为您提供有关正在发生的事情的线索。看,你会发现: - )
希望这有帮助。
的问候,
罗布。
答案 1 :(得分:1)
如果数据库看起来“挂起”,很可能是在另一个非公开会话中对数据进行了修改。
...试
SELECT *
FROM tableA
WHERE tableA.column2 IN ( select .... )
FOR UPDATE NOWAIT;
看看你是否得到了:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
确保在该测试后发出ROLLBACK。
如果确实收到错误,则表示另一个会话锁定了数据。
答案 2 :(得分:0)
对我来说没关系,看看你要执行的更新有多少:
SELECT COUNT(1) FROM tableA WHERE tableA.column2 IN ( select .... )
(其中......来自您上面的代码段)。如果你获得了很多点击量,那么这可能就是问题所在。