Здесь не помогут ни индекс, ни разбиение.
Поскольку city
, area
и region
(вероятно) тесно связаны, число строк результатов будет намного меньше, чем оценки PostgreSQLпотому что он предполагает, что столбцы независимы друг от друга.
Таким образом, вы должны создать расширенную статистику для этих столбцов, новая функция, представленная в PostgreSQL v10:
CREATE STATISTICS youtube_stats (ndistinct)
ON "CITY", "AREA", "REGION" FROM youtube;
ANALYZE youtube;
Теперь у PostgreSQL лучшепредставление о том, сколько существует различных групп.
Затем выделите запросу много памяти, чтобы он мог получить хэш со всеми этими группами в память.Тогда он может использовать агрегат хешей вместо сортировки строк:
SET work_mem = '1GB';
Вам может не понадобиться столько памяти;Эксперимент, чтобы найти более разумный предел.
Затем попробуйте запрос из ответа Джорджа Джозефа:
SELECT x."CITY" || ' | ' || x."AREA" || ' | ' || x."REGION" AS location
FROM (SELECT DISTINCT "CITY", "AREA", "REGION"
FROM youtube) AS x;