SQLSERVER 兩個子查詢都很快,都是1s內,但是當兩者 right join on 后,時間很長,請大神幫忙看一下
TABLEA (1千萬條資料) 和 TABLEB(一萬條資料) 兩個都做了ID 的索引, 兩個分別查詢的時候都很快,但是一join on 后非常慢。
SELECT 'ALL' AS 'Line',E.[ID],E.Model,E.[Produce Week] as '周次',ISNULL(D.QTY,0)AS '已掃描',E.LOT AS '訂單',(ISNULL(D.QTY,0)-E.LOT) as '差額'
FROM
(select ID ,COUNT(*) as 'QTY' from TABLEA GROUP BY ID)D
RIGHT JOIN
(SELECT [Model],[ID],[LOT],[Produce Week] FROM TABLEB WHERE [Produce Week] = '10W' and [Upload Date]='2021')E
ON D.ID=E.ID
ORDER BY '完成率'
uj5u.com熱心網友回復:
right join后的結果集有多少條記錄呢,放到臨時表試試呢話說'完成率'是哪個欄位
uj5u.com熱心網友回復:
那你看一下執行計劃有什么不一樣uj5u.com熱心網友回復:
看上去ID列應該是主鍵,還加了索引,條件里又ID=''?查詢時加了D.ID=''的條件結果和沒有加時是一樣的,這就不明白你的資料和結果是什么樣子了
還有ORDER BY '完成率',這個排序也沒有用,加上去做什么用的?
uj5u.com熱心網友回復:
加AND ID='' 這句代碼,結果是A的ID=''還是B的ID=''了?按你的說法B表ID是主鍵,不可能=''的,條件的ID=''應該是針對A表進行篩選,然后沒有一個和B表匹配的,那你結果的‘已掃描’列是不是都等于0了?
沒有資料和結果不知道什么情況。
如果不糾結這些的話,可以試一下把兩個查詢的子表弄成臨時表,然后對臨時表進行查詢,可能提高查詢速度。
uj5u.com熱心網友回復:
SELECT 'ALL' AS 'Line',E.[ID],E.Model,E.[Produce Week] as '周次',ISNULL(D.QTY,0)AS '已掃描',E.LOT AS '訂單',(ISNULL(D.QTY,0)-E.LOT) as '差額',
CONVERT(varchar,CONVERT(decimal(10,2),CONVERT(decimal(10,2),(isnull(D.QTY,0)))/CONVERT(decimal(10,2),(E.LOT))*100)) + '%' as '完成率'
FROM
(select ID ,COUNT(*) as 'QTY' from TABLEA GROUP BY ID)D
RIGHT JOIN
(SELECT [Model],[ID],[LOT],[Produce Week] FROM TABLEB WHERE [Produce Week] = '10W' and [Upload Date]='2021')E
ON D.ID=E.ID
ORDER BY '完成率'
完成率是自己加上去的哦
uj5u.com熱心網友回復:
現在這個運行下來要13秒,太久了轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/267849.html
標籤:基礎類
