选择带有种子的随机行

时间:2015-12-23 16:50:56

标签: c# sql-server

使用SQL Server,我有一个大约550万行的表,我想随机选择一组符合某些条件的可能 120行。

这是与Select n random rows from SQL Server tablehttps://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服务器端工作的方法,所以我不必检索和处理所有行。

2 个答案:

答案 0 :(得分:2)

如果你想要看起来随意的东西,那么将你的[Pri​​maryKey]与其他一些数据混合......

SELECT *
FROM [your table]
ORDER BY
    CHECKSUM([primarykey]) ^ CHECKSUM('your seed') 

...这仍然是一个表扫描,但它应该有更好的性能然后拉动整个数据集做客户只是丢弃除120行之外的所有内容。

答案 1 :(得分:0)

为每一行指定一个唯一的guid作为索引列(但不是聚簇列)。随机选择三个字母数字字符,然后选择guid以这些字符开头的所有行。

36*36*36=46,656
5,500,000/46,656 ~= 117.88

由于newid()不遵循模式,因此提供随机分组,均匀分布,如果您使用相同的三个字符,您将始终获得相同的数据,这涵盖了播种。

如果该表现不够,请创建另一列以专门索引前三个字符。

(对不起,为了简洁 - 在我的手机上)