使用内部联接删除查询无限执行

时间:2017-08-22 14:58:40

标签: oracle inner-join sql-delete

我正在使用下一个查询从A表中删除行:

delete from 
  (select A.* from A 
  inner join B 
    on A.id = B.id 
  where B.note = '000000000000')

并且此查询无限执行(超过20分钟),而select查询在3.3秒内返回9300行:

select * from 
  (select A.* from A 
  inner join B 
    on A.id = B.id 
  where B.note = '000000000000')

问题出在哪里?

P.S。:删除操作需要40分钟。

P.P.S。:根据"Which is Most Efficient when Deleting Rows: EXISTS, IN, or a VIEW",所描述的例子没有区别。

UPDATE:再次出现相同症状的情况“SELECT很快,DELETE很慢”

DB-admins检查了阻塞情况,发现有两个会话相互阻塞,一个会话是上面描述的sql-delete语句;另一个是未知的,但我想它可能是相同的删除语句或相关表中的另一个删除语句。

根据数据库锁定,这似乎是正确的:What it is, Why it Matters and What to do About it

  

Oracle的实现是维护单独的版本   相关数据块。在一个事务中进行的未提交的更改   在制作它们的交易中可见,而在其他交易中   会话将看到旧的,未更改的版本。这样,隔离   维护,选择语句永不阻止

3 个答案:

答案 0 :(得分:1)

尝试这样的事情

delete from A where id in (select id from B where B.note = '000000000000')

答案 1 :(得分:0)

答案很简单one session is blocking another这就是删除操作花费太多时间的原因:

BLOCKER                           SID 'ISBLOCKING'  BLOCKEE                           SID
------------------------------ ------ ------------- ------------------------------ ------
XXXXXXXXXX                        832  is blocking  XXXXXXXXXX                        124

现在知道如何避免这种情况很好,但这是另一个问题。

答案 2 :(得分:-1)

尝试命名要删除的表:

Delete from A where exists (select...)