这个sql可能导致问题的原因是什么?

时间:2011-02-23 11:57:23

标签: sql oracle

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数据库上运行它。

3 个答案:

答案 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 .... )

(其中......来自您上面的代码段)。如果你获得了很多点击量,那么这可能就是问题所在。