此查询需要11秒才能完成。我已经尝试删除一些字段,以使它更快,没有运气。 有没有办法优化这个?
select
max(ig.group_name) as item_code,
MAX(ig.description) as item_desc,
(SUM(oi.qty * ip1.amount) / MAX(ig.amount)) as qtySum,
MAX(ig.unit) as unit, MAX(ip1.cat) as cat,
max(i.ItemRoute) as ItemRoute
from
order_items oi
inner join orders o on o.localID = oi.local_order_id
inner join items_pc ip1 on (ip1.item = oi.item_code and ip1.unit = oi.unit)
inner join item_groups ig on ig.id = ip1.ItemGroup
inner join items i on i.item = ip1.item
inner join customers c on o.customer_id = c.id
where
oi.qty > 0 and
o.status = 'submitted' and
i.ItemGroup is not null and
o.delivery_date between '7/27/2014' and '7/30/2014'
group by ip1.ItemGroup
order by ItemRoute, cat, item_code
答案 0 :(得分:3)
没有真实数据就不可能说,但优化的工作流程大致是
作为一般规则,请尽量减少查询中要扫描的行数。
早期减少有点难以解释,但是如果你有三个表,A,B和C,每行1M行。如果你有一个where条件,在A上有100k行,在B上有100k行,在C上有1k行,如果你遇到A在与C结合之前与B连接,你可能会查找类似100k行的内容,但是如果在结果与B结合之前,你首先使用C加入A,那么你可能会查找类似1k行的内容。
同样,如果你有一个包含A列和B列的表,并且你的where子句同时包含A和B.如果A上的过滤器返回100k行而B上的过滤器返回1k行,则需要索引(B,A) ,而不是索引(A,B)尽可能快地减少搜索空间。