簡體   English   中英

簡單查詢性能問題

[英]Simple Query Performance Issues

我有兩個查詢,它們背對背運行並填充兩個單獨的網格。 它們不在sql查詢的同一實例中運行,但背對背也不少。

我已經在SSMS中運行了這兩個查詢,每個查詢大約需要5秒。 BO_HRO具有〜600,000行,BO_HParts具有〜1,200,000行,它們之間具有一對多的關系。 正如SSMS所建議的那樣,我還有一個針對delete_by,RO_NO和BName的BO_HRO的索引,以及針對delete_by,RO_NO,Quantity,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

這里有一些想法:

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 ,您甚至可以通過在摘要數據中添加索引來優化查詢。

也許更改您的group by子句,所以使用表別名/名稱?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM