C# LINQ查询花费的时间太长
我正在运行此查询:C# LINQ查询花费的时间太长,c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,我正在运行此查询: 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 {
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-60K行
这张桌子叫做大桌子,大约有10-20行
重新呈现的coulmn some\u inteher\u和\u id是大表上的id,但也可以是0或-1,而than需要获取未知值,因此我无法建立关系,或者我可以吗?如果是,请解释
COUNTRIES_表包含100-200行
coulID和ID是标识列
有什么建议吗?您刚开始就在某个表上打电话给ToList。这是将整个数据库表(包括所有行和列)拉入内存,然后通过Linq对内存数据结构中的对象执行所有后续操作
你不仅会因为在网络上传输的信息比你需要的要多而受到惩罚,而且C语言也不能像数据库一样高效地执行操作。这在一定程度上是因为它失去了对任何索引、任何数据库缓存、任何缓存的编译查询的访问,它在处理如此大的数据集时效率不高,而对查询本身的任何更高级别的优化数据库往往会做很多这方面的工作
接下来,在GroupBy子句中有一个来自db.a_LAGE_表中f的查询,其中[…]是对序列中的每一行执行的。如果整个查询是在数据库级别进行评估的,可能会进行优化,即使不是这样,您也不会通过网络传递信息,这对于每个记录来说都非常慢
这基本上是说从某个表中获取每个记录并将其放入列表中,而不进行任何筛选。这可能是您的问题。您可以从删除ToList开始。您是否将LINQ查询生成的SQL与您将编写的SQL查询进行了比较,以获得相同的数据。这将是我的出发点,我敢打赌它生成的SQL不是最优的。@BenRobinson SQL是从某个表中选择*的,因为他在开始时列出了该表。@Servy,哈哈,是的,刚才注意到了。这就是问题所在。。。我忘了把不该在那里的东西列在清单上。非常感谢。这就是问题所在。。。我忘了把不该在那里的东西列在清单上。非常感谢。
from p in db.SOMETABLE.ToList()