2014-02-20 118 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