如果查询的结果集不使用子查询或视图生成的字段,那么该字段是否仍由子查询处理?我的数据库中有很多用于许多地方的视图,但所需的确切字段集因上下文而异。我没有在每个上下文中复制相似的查询(使用适当的字段组),而是使用了可能包含每个上下文的额外字段的视图。看起来这些额外的视图会影响MySQL的性能(通过删除下面示例中的额外字段,我的性能提升了1/4)。有解决方案吗不同的数据库(即Oracle)?
见下面的例子;运行视图时可以清楚地跳过charge_off_date字段,但它仍会影响性能。
select
l.loan_id, last_payment_date
from
loans as l
left join
(select
loan_id,
max(ph.received_d) as last_payment_date,
max(case
when ph.co = 1 then coalesce(ph.received_d, ph.month)
else null
end) as charge_off_date
from
payment_history as ph) as payment_stats ON payment_stats.loan_id = l.loan_id
答案 0 :(得分:0)
MySQL实例化(非相关)子查询,并为未在视图之外优化的视图创建执行计划。换句话说,MySQL在这种情况下不会优化。
其他数据库在优化方面更聪明。这并不意味着他们会做正确的事,但有机会。
但我建议您将查询编写为只有join
的聚合且没有子查询:
select l.loan_id, max(ph.received_d) as last_payment_date,
max(case when ph.co = 1 then coalesce(ph.received_d, ph.month)
end) as charge_off_date
from loans l left join
payment_history ph
on ph.loan_id = l.loan_id
group by l.loan_id;
from
子句中不需要子查询(无论如何都不允许在MySQL视图中使用)。另外,如果您有where
子句,则应该利用where
子句并提高性能。