我有一个选择查询,如下所示:
select distinct
...some fields
from
table_a,
table_b,
table_c,
...more tables
where
table_a.id = table_b.id and
... (rest of the tables) and
some_field_that_i_care_about = 42
order by
my_field
如果按原样运行该查询,需要大约半秒才能得到我期望的结果。
然而,如果我将同一个查询转换为一个视图(不包括some_field_that_i_care_about = 42
条件),然后我运行:
select *
from the_view
where some_field_that_i_care_about = 42
查询大约需要40秒才能返回相同的数据。
为什么会这样?
答案 0 :(得分:2)
视图只是子查询的语法糖。这样的子查询通常不会导致性能损失,因为它们可以是flattened,即合并到外部查询中。
但是,在这种情况下,ORDER BY会阻止展平。
从视图中删除ORDER BY;无论如何,子查询的顺序是ignored by the outer query。 (如果要对结果进行排序,则必须在最外面的查询中使用ORDER BY。)