在SQL中采样非常大的数据集

时间:2020-06-18 17:57:41

标签: sql postgresql

我有一个非常大的数据集(约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。

提前谢谢!

**编辑**

抱歉,我没有明确询问: 您建议从数据集中提取分层的随机样本,而这些样本不会永远运行吗?

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

有两种采样方法:systembernoulli-您可以在此处详细了解它们:https://wiki.postgresql.org/wiki/TABLESAMPLE_Implementation

在我的计算机上,您的查询针对3000万行的数据运行1分钟30秒,而表maple为5%则只需5秒

PS:UUID v1是基于时间的,因此它们是一种排序的:),所以我想您想改为ORDER BY random()