Используя explain analyze select shop_name, product from shop_prices group by shop, product limit 10
, вы можете увидеть, как Postgres планирует и выполняет запрос и сколько времени занимает выполнение. Вы увидите, что необходимо прочитать всю таблицу (с учетом трудоемких операций чтения с диска), а затем отсортировать ее в памяти - которую, вероятно, необходимо будет кэшировать на диске, прежде чем возвращать результаты. При следующем запуске вы обнаружите, что тот же запрос очень быстр, если число комбинаций shop_name + product очень ограничено и, следовательно, сохраняется в pg_stats после этого анализа объяснения. Дело в том, что такой простой запрос может быть обманчивым.
Вы ускорите выполнение, создав индекс по столбцам, которые вы используете (create index shop_prices_shop_prod_idx on public.shop_prices(shop_name,product)
).
Вам определенно следует изменить Если вы планируете делать какие-либо числовые расчеты, укажите в столбце Price значение Numberri c (или float / float8).
С учетом всего этого, я подозреваю, что эта таблица не является той, которую вы будете использовать, поскольку она У вас нет отметки времени для сравнения цен между месяцами.
Я предлагаю вам завершить разработку таблицы и порассуждать об индексах для повышения производительности. Возможно, вы даже захотите рассмотреть разбиение таблиц https://www.postgresql.org/docs/current/ddl-partitioning.html
Вероятно, вы будете выполнять все виды запросов к этим данным, поэтому не существует простого решения для всех них.
Во что бы то ни стало верните, возможно, более конкретные c вопросы с полным описанием таблицы и выводом из оператора объяснения анализа для запросов, которые вы пробуете, и получите полезные советы.
С уважением,
Bjarni