2015-11-01 42 views
0

我在Oracle11g中有这样的查询作出查询在:如何在WHERE子句的运行速度

SELECT DOC_ID,DOC_NAME,DESC 
FROM TABLE1 
WHERE DOC_ID NOT IN(
    SELECT DOC_ID FROM TABLE2 
) 

SQL查询以上运行速度很慢,因为我已经在表中如此多的数据。
有没有解决方案可以获得相同的结果,并且性能更好,运行速度更快?
任何帮助非常感谢。
谢谢。

+4

什么是查询计划?什么是“非常缓慢”?你需要多久才能运行?桌子有多大?你可能会把这个重写为'not exists',但如果统计数据是准确的并且你真的使用了11g,那么优化器可能会在你的内部重写。 –

+0

谢谢@JustinCave。使用'not exists'会更快。 –

回答

2

使用WHERE EXISTS可能会有更好的表现:

SELECT DOC_ID,DOC_NAME,DESCr 
FROM TABLE1 t1 
WHERE not exists (
    SELECT 1 FROM TABLE2 where 
    doc_id = t1.doc_id 
); 

例子:http://sqlfiddle.com/#!4/4b59e/3

1

我不会在声明中使用它。如果你对我的想象加入为你的关键之一应该是非常非常快:

select tb1.DOC_ID, tb1.DOC_NAME, tb1.DESC 
from table1 tb1 
left join table2 tb2 
on tb1.DOC_ID = tb2.DOC_ID 
where tab2.DOC_ID is not null