优化程序是否使用where where子句过滤子查询

时间:2010-03-27 01:13:05

标签: sql performance

采取以下查询:

select * from
(
  select a, b
  from c
    UNION
  select a, b
  from d
)
where a = 'mung'
order by b

优化器通常会计算出我正在过滤值“mung”并因此过滤子查询中每个查询的mung。

OR

它会在子查询联合中运行每个查询并将结果返回到外部查询进行过滤(如查询可能建议的那样)

在这种情况下,以下查询会表现得更好:

select * from
(
  select a, b
  from c
  where a = 'mung'
    UNION
  select a, b
  from d
  where a = 'mung'
)
order by b

显然查询1最适合维护,但它是否牺牲了很多性能呢?

哪个最好?

修改 抱歉,我忽略了在查询中添加 order by 子句,以表明为什么一开始就需要成为子查询!

修改 好吧,我认为这将是一个简单的答案,但我忘了我在这里谈论数据库!通过分析器运行它表明没有进行优化,但这当然可能是因为我的表中只有4行。我希望更简单的是或否..将需要设置一些更复杂的测试。

我现在在mySQL上,但我在这里得到了一般答案......

1 个答案:

答案 0 :(得分:2)

使用:

SELECT x.a, 
       x.b
  FROM TABLE_X x
 WHERE x.a = 'mung'
UNION
SELECT y.a, 
       y.b
  FROM TABLE_Y y
 WHERE y.a = 'mung'
  • 在给定的上下文中不需要子查询
  • 上面的查询将使用索引(如果在“a”列上可用);使用子查询方法,没有可以使用的索引
  • 如果您不必担心重复项,请使用UNION ALL - 它会比UNION
  • 更快