[英]Linq query takes too long when using Func & OrderByDescending
[英]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.