簡體   English   中英

LINQ查詢耗時太長

[英]LINQ Query takes too long

我正在運行此查詢:

List<RerocdByGeo>  reports = (from p in db.SOMETABLE.ToList()
       where (p.colID == prog && p.status != "some_string" && p.col_date < enddate && p.col_date > startdate)
       group p by new {
           country = (
           (p.some_integer_that_represents_an_id <= -0) ? "unknown" : (from f in db.A_LAGE_TABLE where (f.ID ==  p.some_integer_that_represents_and_id) select f.COUNTRIES_TABLE.COU_Name).FirstOrDefault()),
           p.status }
           into g
    select new TransRerocdByGeo
       {
           ColA = g.Sum(x => x.ColA),
           ColB = g.Sum(x => x.ColB),
           Percentage = (g.Sum(x => x.ColA) != null && g.Sum(x => x.ColA) != 0) ? (g.Sum(x => x.ColB) / g.Sum(x => x.ColA)) * 100 : 0,
           Status = g.Key.status,
           Country = g.Key.country
       }).ToList();

sql中對於同一個數據庫的類似查詢會運行幾秒鍾,而這個查詢大約需要30-60秒......

表SOMETABLE包含10-60 K行的數量,此處調用的表A_LARGE_TABLE包含大約10-20個行

coulmn some_inteher_that_reoresents_an_id是大表上的id,但也可以是0或-1而不是需要得到“未知”值,所以我不能建立關系(或者我可以嗎?如果是這樣請解釋)

COUNTRIES_TABLE包含100-200行。

coulID和ID是標識列......

有什么建議么 ?

您在開始時正在“SOMETABLE”上調用ToList 這會將包含所有行和所有列的整個數據庫表拉入內存,然后通過該內存數據結構中的Linq-to-objects執行所有后續操作。

您不僅要承擔通過網絡傳輸更多信息的懲罰(這很慢),而且C#無法像數據庫那樣高效地執行操作。 這部分是因為它無法訪問任何索引,任何數據庫緩存,任何緩存的編譯查詢,它在處理大型數據集時效率不高,並且查詢本身的任何更高級別的優化(數據庫傾向於很多)。

接下來,您from f in db.A_LAGE_TABLE where [...]GroupBy子句進行查詢, from f in db.A_LAGE_TABLE where [...] 對序列中的每一行執行from f in db.A_LAGE_TABLE where [...] 如果整個查詢在數據庫級別進行評估,可能會進行優化,即使不是,您也不會通過網絡傳遞每條記錄的信息(這很慢)。

from p in db.SOMETABLE.ToList()

這基本上是說“從SOMETABLE獲取每條記錄並將其放入List ”,而不進行過濾。 這可能是你的問題。

暫無
暫無

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

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