如何使这个查询更快......很多内部联接

时间:2014-07-30 08:46:00

标签: sql sql-server

此查询需要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

1 个答案:

答案 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)尽可能快地减少搜索空间。