在红移中选择随机行的最佳方式,无需按顺序排列



我必须一次从2亿行中选择一组行(比如200个唯一的行(,而不需要按顺序排列,而且必须高效。

由于您正在经历排序200M行可能需要一段时间,如果您只想要200行,那么这是一笔不需要支付的费用。但是,如果要选择200个随机行,则需要根据随机值进行排序。否则,基表的排序顺序和Redshift切片的回复顺序将有意义地扭曲样本。

你可以通过(通过随机过程(向下采样,从而获得更易于管理的行数,然后按随机值排序,并选择最后200行。虽然这确实需要对行进行排序,但它的数量要小得多,这将大大加快速度。

select a, b from (
select a, b, random() as ranno 
from test_table)
where ranno < .005
order by ranno
limit 200;

您从200M行开始。在WHERE子句中选择其中的.5%。然后在选择200之前对这10000行进行排序。这应该会加快速度并保持选择的随机性。

将数据采样到合理的百分比,如10%、5%、1%等,。。etc应该使您的音量达到可管理的大小。然后,您可以按样本排序,并选择所需的行数。

select * from (select *, random() as sample 
from "table") 
where sample < .01 
order by sample limit 200

以下是我觉得对我有用的问题的扩展,其他人可能也会觉得有帮助。在我的例子中,我有一个巨大的表,我可以通过一个关键字段值将其拆分成更小的子集,但即使在拆分后,每个子集的体积也会保持很大(数以千万计的行(,我仍然需要对其进行采样。我最初担心采样不会对我使用With语句创建的子集起作用,但事实并非如此。之后,我比较了完整子集(2000万(和样本(30K(之间所有不同有意义密钥的样本分布,得到了几乎准确的分布,效果很好。下面的示例代码:

With subset as (select * from "table" Where Key_field='XYZ')
select * from (select *, random() as sample 
from subset) s
where s.sample < .01 
order by s.sample limit 200

最新更新