来自sqlite视图的性能损失

时间:2017-11-05 00:22:35

标签: sqlite views database-performance

我有一个选择查询,如下所示:

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秒才能返回相同的数据。

为什么会这样?

1 个答案:

答案 0 :(得分:2)

视图只是子查询的语法糖。这样的子查询通常不会导致性能损失,因为它们可以是flattened,即合并到外部查询中。

但是,在这种情况下,ORDER BY会阻止展平。

从视图中删除ORDER BY;无论如何,子查询的顺序是ignored by the outer query。 (如果要对结果进行排序,则必须在最外面的查询中使用ORDER BY。)