275
|
John M Gant aman_novice · 技术社区 · 15 年前 |
1
345
对于有关大型表的“纯垃圾”注释的回应是:您可以这样做以提高性能。
这项工作的成本将是关键值扫描加上连接成本,在大表上选择小百分比应该是合理的。 |
2
69
根据你的需要,
我在一张很大的桌子上测试过
花了20多分钟。
花了2分钟。
性能也将改善较小的样品在
请记住,这并不像
见 MSDN page . |
3
37
newid()/order-by将有效,但对于大型结果集来说代价非常高,因为它必须为每一行生成一个ID,然后对它们进行排序。 从性能角度来看,tablesample()很好,但您将得到结果的聚集(页面上的所有行都将返回)。 为了更好地执行真正的随机抽样,最好的方法是随机筛选出行。我在SQL Server联机丛书文章中找到了以下代码示例 Limiting Results Sets by Using TABLESAMPLE :
当针对具有1000000行的表运行时,以下是我的结果:
如果你能不使用tablesample,它会给你最好的性能。否则使用newid()/filter方法。如果结果集很大,newid()/order by应该是最后的选择。 |
4
21
Selecting Rows Randomly from a Large Table 在msdn上有一个简单、清晰的解决方案,可以解决大规模的性能问题。
|
5
9
如果您(与OP不同)需要特定数量的记录(这使得校验和方法变得困难),并且希望获得比Tablesample本身提供的更随机的样本,并且希望获得比校验和更快的速度,则可以将Tablesample和newid()方法合并,如下所示:
在我的例子中,这是随机性(我知道这不是真的)和速度之间最直接的妥协。根据需要更改tablesample百分比(或行)-百分比越高,样本的随机性就越强,但预计速度会呈线性下降。(注意tablesample不接受变量) |
6
8
只需按随机数排序表,并使用
更新
刚试过,然后
|
7
8
对于具有1、7和1300万行的表,此链接对orderby(newid())和其他方法进行了有趣的比较。 通常,当在讨论组中询问有关如何选择随机行的问题时,会提出newid查询;它很简单,对于小表来说非常有效。
但是,当您将newid查询用于大型表时,它有一个很大的缺点。ORDER BY子句会将表中的所有行复制到tempdb数据库中,并在其中进行排序。这会导致两个问题:
您需要的是一种随机选择行的方法,这些行不会使用tempdb,并且不会随着表变大而变慢。下面是一个关于如何做到这一点的新想法:
这个查询背后的基本思想是,我们希望为表中的每一行生成一个介于0和99之间的随机数,然后选择随机数小于指定百分比值的所有行。在本例中,我们希望随机选择大约10%的行;因此,我们选择随机数小于10的所有行。 请阅读 MSDN . |
8
4
在MySQL中,您可以这样做:
|
9
4
这是初始种子思想和校验和的组合,在我看来,它可以在不花费newid()的情况下给出适当的随机结果:
|
10
2
试试这个:
|
11
2
在答案中还没有看到这种变化。我在需要的地方有一个额外的约束,给定一个初始种子,每次选择相同的行集。 对于SQL SQL: 最小示例:
规范化执行时间:1.00 newid()示例:
规范化执行时间:1.02
带初始种子的选择:
如果您需要在给定种子的情况下选择相同的集合,这似乎是可行的。 |
12
0
似乎newid()不能在where子句中使用,因此此解决方案需要内部查询:
|
13
0
我在子查询中使用它,它在子查询中返回相同的行
然后我解决了将父表变量包含在
注意哪种情况 |
14
0
未指定正在使用的服务器端处理语言(如php、.net等),但如果是php,则获取所需的数字(或所有记录),而不是在查询中随机使用php的shuffle函数。我不知道.NET是否有等价的函数,但如果它有,那么如果您使用.NET,请使用它。 按rand()排序可能会有相当大的性能损失,这取决于涉及的记录数。 |
15
-1
这对我很有用:
|
ecology · 基于R中随机生成数集的子集列 2 年前 |
Alan Jones · 使用random从列表创建动态列表 2 年前 |
breking bed · 单击按钮时如何随机选择唯一编号 2 年前 |
Carrot Man · 如何让熊猫数据框随机填充1和0? 2 年前 |
Justin Arnold · 范围内的随机数不是随机数 2 年前 |
Menna Magdy · 如何使用非模型字段进行过滤? 2 年前 |