如何检查 any 连接和布尔检查之间的 entity framework 性能差异?
How to check entity framework performance difference between a join with any and a boolean check?
我想知道是否有人可以告诉我运行像这样的 EF 查询之间的性能差异(如果有的话)
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.Photos.Any())
.AsQueryable();
还有这个
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.HasPhoto == true)
.AsQueryable();
在 'User' 上检查布尔值 'HasPhoto' 还是在 ICollection 运行 上检查 .Any() 会比在大型数据集上更快更好?
怎么查看速度差异,用什么工具?
为什么不试试呢!您可以使用计时器来测量摊位的时间。尝试使用类似这样的东西
var watchOne = System.Diagnostics.Stopwatch.StartNew();
testOne();
watchOne.Stop();
var resOne = watchOne.ElapsedMilliseconds;
var watchTwo = System.Diagnostics.Stopwatch.StartNew();
testTwo();
watchTwo.Stop();
var resTwo= watchTwo.ElapsedMilliseconds;
public void testOne(){
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.Photos.Any())
.AsQueryable();
}
public void testTwo(){
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.HasPhoto == true)
.AsQueryable();
}
从整体上考虑 Entity Framework 的性能注意事项:
- 加载和验证数据的成本低¹ 相对成本。
- 执行查询也有一个低¹ 相对成本
¹[总成本的增加与查询 return 对象的数量成正比。
考虑到两者
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.Photos.Any())
.AsQueryable();
和
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.HasPhoto == true)
.AsQueryable();
return相同的结果,实际return时间将是毫秒级的。
不过,考虑到结果集比较大,考虑.Any()
LINQ扩展方法
public static bool Any<TSource> (this System.Collections.Generic.IEnumerable<TSource> source)
并且此方法不会 return 集合中的任何一个元素。相反,它确定集合是否包含任何元素(因此减少了总执行时间)。
因此,最终 Any()
扩展方法的性能会更好。
我想知道是否有人可以告诉我运行像这样的 EF 查询之间的性能差异(如果有的话)
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.Photos.Any())
.AsQueryable();
还有这个
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.HasPhoto == true)
.AsQueryable();
在 'User' 上检查布尔值 'HasPhoto' 还是在 ICollection 运行 上检查 .Any() 会比在大型数据集上更快更好? 怎么查看速度差异,用什么工具?
为什么不试试呢!您可以使用计时器来测量摊位的时间。尝试使用类似这样的东西
var watchOne = System.Diagnostics.Stopwatch.StartNew();
testOne();
watchOne.Stop();
var resOne = watchOne.ElapsedMilliseconds;
var watchTwo = System.Diagnostics.Stopwatch.StartNew();
testTwo();
watchTwo.Stop();
var resTwo= watchTwo.ElapsedMilliseconds;
public void testOne(){
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.Photos.Any())
.AsQueryable();
}
public void testTwo(){
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.HasPhoto == true)
.AsQueryable();
}
从整体上考虑 Entity Framework 的性能注意事项:
- 加载和验证数据的成本低¹ 相对成本。
- 执行查询也有一个低¹ 相对成本
¹[总成本的增加与查询 return 对象的数量成正比。
考虑到两者
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.Photos.Any())
.AsQueryable();
和
var users = _context.Users.Include(p => p.Photos)
.Where(p => p.HasPhoto == true)
.AsQueryable();
return相同的结果,实际return时间将是毫秒级的。
不过,考虑到结果集比较大,考虑.Any()
LINQ扩展方法
public static bool Any<TSource> (this System.Collections.Generic.IEnumerable<TSource> source)
并且此方法不会 return 集合中的任何一个元素。相反,它确定集合是否包含任何元素(因此减少了总执行时间)。
因此,最终 Any()
扩展方法的性能会更好。