Выборка очень большого набора данных в SQL - PullRequest
1 голос
/ 18 июня 2020

У меня очень большой набор данных (около 40 миллионов строк), и я пытаюсь взять его стратифицированную выборку по двум классам (из класса столбца).

Мне уже приходилось объединять все разные таблицы в течение каждого месяца, и мне приходилось увеличивать количество строк до повторяющихся строк (поэтому у меня нет уникального идентификатора для каждой строки).

Я пробовал следующий метод, но он занимает вечность:

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 голосов
/ 19 июня 2020

Вы должны использовать TABLESAMPLE, как предлагает @Laurenz Albe в комментариях.

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

На моем компьютере ваш запрос выполняется в течение 1 мин 30 сек c для 30 миллионов строк, а с таблицами 5% для таблицы требуется всего 5 секунд

PS: UUID v1 основан на времени, поэтому они вроде отсортированы :) поэтому я думаю, вы хотите ORDER BY random() вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...