Oracle SQL查询性能改进:减去vs不存在的地方

时间:2012-10-03 10:04:41

标签: sql oracle query-optimization

我需要提高此查询的性能:

Select 
   t1.column1, t1.column2 
From
   table1 t1, table2 t2
Where 
   t1.id = t2.id and
   t1.some_column = t2.some_column
--------
minus
--------
Select 
   t1.column1, t1.column2 
From
   table1 t1, table2 t2, table3 t3
Where 
   t1.id = t2.id and
   t1.some_column = t2.some_column and
   t1.id = t3.id

我正在尝试使用“not exists”而不是“minus”重写此查询。有人可以给我一个建议吗?

2 个答案:

答案 0 :(得分:4)

怎么样?

Select 
   t1.column1, t1.column2 
From
   table1 t1, table2 t2
Where 
   t1.id = t2.id
   and t1.some_column = t2.some_column
   and not exists (select 1 from table3 t3 where t1.id = t3.id)

答案 1 :(得分:4)

它取决于第一个查询和table3之间的比例大小/# - 行:

  • 如果table3有多个行,我可能会使用@bpgergo解决方案,因为它只需要运行除了查询很少时间它应该很快(我假设有一个id的索引);
  • 如果table3有几个行,我会使用以下解决方案,因为子查询可以一次运行并在内存缓存中进行匹配:
SELECT t1.column1, t1.column2
FROM table1 t1, table2 t2
WHERE t1.id = t2.id
AND t1.some_column = t2.some_column
AND t1.id NOT IN (SELECT t3.id FROM table3 t3);

任何一个解决方案都可以从每个表id列的索引中受益,如果是这样的话,还可以在用于过滤第一个查询的列上使用其他索引(或包含id的复合索引)。 / p>