2014-02-20 59 views
1

我有两个查询可以背对背并填充两个单独的网格。它们不会在sql查询的同一个实例中运行,但是不会少于。简单查询性能问题

我已经在SSMS中运行了这两个查询,每个查询约5秒。 BO_HRO具有约600,000行,BO_HParts具有约1,200,000行,分别具有一对多关系。我也有一个SSIS建议的索引,这些索引是BO_HRO的deleted_by,RO_NO和BName以及一个关于deleted_by,RO_NO,Quanity,PartNo和PartDesc的BO_HParts的索引。

SELECT TOP 10000 bo_hparts.partno, 
          bo_hparts.partdesc, 
          SUM(bo_hparts.quanity) AS qtysum 

FROM bo_hparts INNER JOIN bo_hro ON bo_hparts.ro_no = bo_hro.ro_no 

WHERE bo_hparts.deleted_by < 0 AND bo_hro.deleted_by < 0 

GROUP BY bo_hparts.partno, bo_hparts.partdesc 
ORDER BY SUM(bo_hparts.quanity) DESC, bo_hparts.partno; 

SELECT TOP 10000 bo_hro.bname, 
          bo_hparts.partno, 
          bo_hparts.partdesc, 
          SUM(bo_hparts.quanity) AS qtysum 

FROM bo_hparts INNER JOIN bo_hro ON bo_hparts.ro_no = bo_hro.ro_no 

WHERE bo_hparts.deleted_by < 0 AND bo_hro.deleted_by < 0 

GROUP BY bo_hro.bname, bo_hparts.partno, bo_hparts.partdesc 
ORDER BY SUM(bo_hparts.quanity) DESC, bo_hro.bname, bo_hparts.partno 

我的老板仍然要以提高性能,我不知道自己还能做些什么实现自己的目标。有没有其他的方法来提高速度?

我这里有一个执行计划https://dl.dropboxusercontent.com/u/99733863/BO_HParts%20Join%20BO_HRO.sqlplan

+0

请更新带有表别名的查询,以便我们可以确定列来自哪些表。此外,你可以删除'distinct' - 看看是否有助于性能。而且,'deleted_by'是否具有单个值(例如'-1'),还是您真的在检查多个值? –

+0

@GordonLinoff添加别名和'distinct'并没有什么区别。您的deleted_by假设是正确的,它只是-1或1的单个值(-1未删除,1被删除) – shadowjfaith

+0

在这种情况下,对于初学者,您可以简单地使用'= -1'代替'<0' 。我不知道这会有多大的影响,但是在任何情况下都值得这样做...... – PinnyM

回答

1

这里有一些想法:

更改where子句明确比较:

WHERE bo_hparts.deleted_by = -1 AND bo_hro.deleted_by = -1 

这将允许您使用复合索引,如bo_hparts(deleted_by, ro_no)。这可能有助于查询。

bo_hro创建覆盖索引。这将是bo_hro(ro_no, deleted_by, quantity)。如果记录很广泛,这可能会有所帮助。

bo_hparts的覆盖指数也可能有所帮助,但这可能是一个较小的表格,因此它可能不那么重要。

如果你关心的最低数量,然后尝试添加:

having sum(bo_hparts.quantity) > 1000 

这样可以使order by更有效。尽管如此,你试图做的是计算密集型的。如果您需要此类查询的实时性能,则可能需要考虑使用触发器来使摘要数据保持最新。这会将查询减少到order by - 您甚至可以通过在摘要数据中使用索引来进行优化。

+0

虽然我不能真正把任何这些地方,除了明确的比较他们都会帮助。我的老板不愿意为这个查询索引表,并保持触发器会为他想要的东西矫枉过正。如果没有额外的零件,它就不得不告诉你的老板这是不行的,但这就是它的缺点。 – shadowjfaith

0

也许by子句改变你的组,所以使用表别名/名称?

+0

表名不起作用。 – shadowjfaith

+0

让我尝试重写: SELECT TOP 10000 bo_hparts.partno, bo_hparts.partdesc, SUM(bo_hparts.quanity)AS qtysum FROM bo_hparts一个,bo_hro b WHERE a.ro_no = b.ro_no AND bo_hparts.deleted_by <0 AND bo_hro.deleted_by <0 GROUP BY bo_hparts.partno,bo_hparts.partdesc ORDER BY SUM(bo_hparts.quanity)DESC,bo_hparts.partno; – Laurens

+0

@Laurens您应该将该信息添加到您的答案中,而不是作为评论。 – Bakuriu