0

我有一個foreach環查找一個querythat此查詢爲每一個item一個innerjoin

,但它是如此緩慢慢速查詢。

foreach (string item in X) 
{ 
    //This is the prototype 
    querystring = "select distinct g.N,g.NH + ' - ' + g.NV + ' - ' + g.S + ' - ' + g.VS ID 
    from Table1 as g inner join Table2 as d on d.V=g.V 
    where d.MD= '1234' and g.AC= 'item' and 
     g.N <> '' and g.NV <> '' and g.S <> '' and g.VS <> '' ORDER BY g.N"; 
} 

我跑Estimated Execution Plan,我不能在這裏附上的結果,但對於表1中的index seek(nonClustered)成本爲40%parallelism (repartion streams) is 24%剩下的全是低的。

+1

單個查詢是否緩慢,還是需要大量時間來處理'foreach'? – HoneyBadger

+0

即使是單個查詢也很慢,並且每次搜索最多20次。但它太慢了。需要4到7秒才能給出結果 – lol

+0

啓動單個查詢可能更有效,並且可以在C#(?)代碼中檢索X中每個項目的相關數據。 – HoneyBadger

回答

0

您現在正在向數據庫發出多達20個相同的查詢(除where條件外,其他條件相同)。因此,我會做的是火一個查詢,如:

SELECT  DISTINCT g.N 
,   g.NH + ' - ' + g.NV + ' - ' + g.S + ' - ' + g.VS ID 
from  Table1 as g 
INNER JOIN Table2 as d 
     ON d.V=g.V 
WHERE  d.MD= '1234' 
     AND g.N <> '' 
     AND g.NV <> '' 
     AND g.S <> '' 
     AND g.VS <> '' 
ORDER BY g.N 

而且在某種可變負載的結果,DictionaryDatatable似乎你最好的選擇。

當您在變量中包含所有數據時,可以在X中查詢單個項目的結果。例如,您可以使用Linq

此外,我剛剛複製您的查詢,但所有字符串連接我也會在C#中執行。因此,分別選擇g.NHg.NV等,並將它們連接在需要它們的地方。

最後,你確定你需要DISTINCT嗎?通常當你必須使用它時,這意味着JOIN條件是錯誤/不完整的。這可能是正確的,只要確定它是。