按 GUID 排序与随机输入的 Skip(Random(0, Count)) 性能

问题描述 投票:0回答:1

只是想知道使用实体框架访问 SQL Server 中的随机条目的一些性能问题。

我发现很多地方推荐的通用解决方案是使用

db.Table.OrderBy(x => Guid.NewGuid()).FirstOrDefault()

我想知道的是,使用它是否会更有效

var skip = random.Next(0, db.Table.Count());
db.Table.OrderBy(x => x.Id).Skip(skip).FirstOrDefault()

因为第一个替代方案依赖于随机地对表中的每个条目重新排序(除非 SQL Server 对此有一些特殊的优化?),而第二个替代方案应该检索项目的数量(我相信它会在恒定的时间内运行),然后只检索单一元素。

c# sql-server performance entity-framework random
1个回答
0
投票

Entity Framework Core 6+ 新增了一个功能:

EF.Functions.Random()

db.Table.OrderBy(x => EF.Functions.Random()).FirstOrDefault()

这种方法的优点是它使用了数据库引擎的内部功能,并且已经为大多数数据库实现了。

参见https://github.com/dotnet/efcore/issues/16141#issuecomment-666641607

© www.soinside.com 2019 - 2024. All rights reserved.