[英]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.