下面是代码片段。使用EF6。
var itemNames = context.cam.AsParallel()
.Where(x=> x.cams ==
"edsfdf")
.Select(item => item.fg)
.FirstOrDefault();
为什么PLINQ比较慢?
发布于 2018-09-29 06:27:36
如果你看一下.AsParallel()
的签名,它需要一个IEnumerable<T>
,而不是一个IQueryable<T>
。linq查询只有在保存为IQueryable时才会转换为SQL语句。一旦枚举了它,它就会执行查询并返回记录。
因此,要分解您所拥有的查询:
context.cam.AsParallel()
这段代码基本上将在数据库上执行SELECT * FROM cam
,然后开始迭代results.The结果将被传递到ParallelQuery中。这实际上会将整个表加载到内存中。
.Where(x=> x.cams == "edsfdf")
.Select(item => item.fg)
.FirstOrDefault()
在此之后,所有这些操作都将并行进行。与启动大量线程并管理它们之间的锁定和并发的开销相比,一个简单的字符串相等比较可能是非常便宜的( PLINQ将为您处理)。并行处理和成本/收益是一个复杂的主题,但它通常是best saved for CPU-intensive work。
如果您跳过了AsParallel()
调用,那么在linq语句的整个过程中,所有内容都保持为IQueryable,因此EntityFramework将发送一个类似于SELECT fg FROM cam WHERE cams = 'edsfdf'
的命令并返回该结果,SQL Server将对该结果进行优化以实现非常快速的查找,特别是在cams上有索引的情况下。
https://stackoverflow.com/questions/52562730
复制相似问题