Mat*_*n L 2 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 {
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();
Run Code Online (Sandbox Code Playgroud)
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是标识列......
有什么建议 ?
Ser*_*rvy 15
你在开始时正在呼叫ToList"SOMETABLE".这会将包含所有行和所有列的整个数据库表拉入内存,然后通过该内存数据结构中的Linq-to-objects执行所有后续操作.
您不仅要承担通过网络传输更多信息的惩罚(这很慢),而且C#无法像数据库那样高效地执行操作.这部分是因为它无法访问任何索引,任何数据库缓存,任何缓存的编译查询,它在处理大型数据集时效率不高,并且查询本身的任何更高级别的优化(数据库倾向于很多).
接下来,您将在GroupBy子句from f in db.A_LAGE_TABLE where [...]中查询为序列中的每一行执行的查询.如果整个查询在数据库级别进行评估,可能会进行优化,即使不是,您也不会通过网络传递每条记录的信息(这很慢).
from p in db.SOMETABLE.ToList()
Run Code Online (Sandbox Code Playgroud)
这基本上是说"从SOMETABLE中获取所有记录并将其放入List"中,而不进行过滤.这可能是你的问题.
| 归档时间: |
|
| 查看次数: |
4156 次 |
| 最近记录: |