选择带有种子的随机行
本文关键字:随机 种子 选择 | 更新日期: 2023-09-27 18:27:56
使用SQL Server,我有一个大约有550万行的表,我想随机选择一组符合某些条件的,可能是120行。
这是与从SQL Server表中随机选择n行和https://msdn.microsoft.com/en-us/library/cc441928.aspx,但我的问题是,我希望能够对其进行种子设置,这样我就可以连续地随机选择相同的120行,然后如果我使用不同的种子,则可以获得不同的随机行集。
我可以在我的应用程序中做这样的事情:
var rand = new Random(seed);
var allExamples = db.myTable.Where(/*some condition*/).ToList();
var subSet = db.myTable.Select(x => new { x, r = rand.NextDouble())
.OrderBy(x => x.r)
.Take(120)
.Select(x => x.x).ToList();
这是有效的,但是,正如你可能猜到的,550万行的速度非常慢。因此,我真的在寻找一种在SQL服务器端实现这一功能的方法,这样我就不必检索和处理所有行。
如果你想要看起来随机的东西,那么把你的[PrimaryKey]和一些其他数据混合。。。
SELECT *
FROM [your table]
ORDER BY
CHECKSUM([primarykey]) ^ CHECKSUM('your seed')
这仍然是一个表扫描,但它应该有更好的性能,然后拉取整个数据集只会让客户端丢弃120行以外的所有数据。
为每一行分配一个唯一的guid作为索引列(但不是集群列)。随机选择三个字母数字字符,然后选择guid以这些字符开头的所有行。
36*36*36=46,656
5,500,000/46,656 ~= 117.88
由于newid()
不遵循一个模式,该模式提供了随机分组、均匀分布,并且如果您使用相同的三个字符,您将始终获得相同的数据,这涵盖了播种。
如果这还不够高性能,可以创建另一列来专门索引前三个字符。
(很抱歉简短-在我的手机上)