我正在使用下一个查询从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的实现是维护单独的版本 相关数据块。在一个事务中进行的未提交的更改 在制作它们的交易中可见,而在其他交易中 会话将看到旧的,未更改的版本。这样,隔离 维护,选择语句永不阻止。
答案 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...)