如果不做额外的工作,你无法真正得到一个好的答案。
在SQL语句iteself之后,最重要的是对象(表格和索引在这种情况下)的统计数据是有代表性的。
然后,你真的需要看看oracle选择的访问路径 - 许多方法来做到这一点。
尝试
EXPLAIN PLAN SET STATEMENT_IS = 'SQL01' FOR
DELETE FROM item i
WHERE NOT EXISTS (SELECT 1 FROM item_queue q WHERE q.n=i.n)
AND NOT EXISTS (SELECT 1 FROM tool_queue t WHERE t.n=i.n);
然后
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
也许在这里发表的结果。
当你尝试不同的事情 - 比如重新编写查询,修改索引,等等,你会发现,访问路径的变化。
这是一个相当复杂的区域 - 你需要学习/实践。
删除是有很多原因慢,但一大因素是对表的索引的维护。然而,就你而言,你说只有10k行非常小。 (顺便说一下,你在这里没有给出时间安排,目前是需要1,10或者100秒吗?你想达到什么目标?)所以我会关注通过更大表格的访问路径。
我的第一个方法将可能是:
DELETE FROM item i
WHERE NOT EXISTS
(SELECT NULL
FROM item_queue q,
tool_queue g
where q.key = g.key -- if the tables are related
AND q.n=i.n) ;
但是就像我说这里有很多因素。
请重新格式化您的代码,以便它不是在滚动窗格。 – Timothy 2010-03-16 16:03:26