我有一个非常大的数据集(约4000万行),并且我试图在两个类(来自列类)中进行分层抽样。
我已经不得不每月合并所有不同的表,并且不得不将行数扩展为重复的行(因此,我没有每行唯一的标识符)。
我尝试了以下方法,但这种方法永远无法解决:
SELECT *
FROM (SELECT *,
row_number() OVER (PARTITION BY subquery.class ORDER BY uuid_generate_v1()) AS sequence
FROM (SELECT * FROM all_tables)
AS subquery)
AS sub2
WHERE sub2.sequence <= 10
我正在使用PostgreSQL 12.1。
提前谢谢!
**编辑**
抱歉,我没有明确询问: 您建议从数据集中提取分层的随机样本,而这些样本不会永远运行吗?
答案 0 :(得分:0)
您应该使用@Laurenz Albe在评论中建议的TABLESAMPLE
。
SELECT *
FROM (
SELECT *, row_number() OVER (PARTITION BY subquery.class ORDER BY uuid_generate_v1()) AS sequence
FROM (
SELECT *
FROM all_tables TABLESAMPLE system(5) -- how much % from the rows to return
) AS subquery
)
AS sub2
WHERE sub2.sequence <= 10
有两种采样方法:system
和bernoulli
-您可以在此处详细了解它们:https://wiki.postgresql.org/wiki/TABLESAMPLE_Implementation
在我的计算机上,您的查询针对3000万行的数据运行1分钟30秒,而表maple为5%则只需5秒
PS:UUID v1是基于时间的,因此它们是一种排序的:),所以我想您想改为ORDER BY random()