1

我需要提高这个查询的性能:

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

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

4

2 回答 2

5

这个怎么样?

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)
于 2012-10-03T10:07:40.723 回答
5

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

  • 如果 table3 有很多行,我可能会使用@bpgergo 解决方案,因为它只需要运行几次except查询并且应该很快(我假设 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用于过滤第一个查询的列上的附加索引(或包含 的复合索引)。

于 2012-10-03T10:36:00.653 回答