У меня есть база данных, полная таблиц.
Я использую pgAdmin для доступа к нему.
Имя одной таблицы timecycle
, а другие называются event_run_x
, где 'x' - номер для каждой отдельной таблицы.
Я хотел бы перечислить все таблицы с его размером, но те, которые были созданы только в 2018 году.
До сих пор мне удавалось перечислить все базы данных по размеру:
SELECT relname AS table_name, pg_size_pretty(table_size) AS size, table_size
FROM (
SELECT pg_catalog.pg_namespace.nspname AS schema_name, relname, pg_relation_size(pg_catalog.pg_class.oid) AS table_size
FROM pg_catalog.pg_class JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
) t
WHERE schema_name NOT LIKE 'pg_%';
Каждая таблица event_run_x
имеет много элементов с разными идентификаторами. Из таблицы timecycle
у меня есть тот же идентификатор и столбец с именем date
. Я могу получить все идентификаторы с 2018 года с:
SELECT * FROM timecycle WHERE extract(year from date) = 2018
Теперь мне нужно изменить первый код, чтобы он отображал только таблицы с идентификатором, который указан в последнем запросе. (из цикла 2018 год)
идентификаторы из event_run_x
не повторяются в другом event_run_y
(x! = Y ofc). Каждый event_run_x
идентификатор должен иметь один и тот же год . Таким образом, если в запросе временного цикла есть идентификатор из скажем event_run_8
, то все идентификаторы из event_run_8
будут в указанном запросе, и наоборот.
Пример:
Event_run_1:
id |
----|
1 |
2 |
3 |
4 |
-----
Event_run_2:
id |
----|
5 |
6 |
7 |
----|
timecycle:
id | date
-----------
1 | 2018-01-01 00:00:00
2 | 2018-01-01 00:00:00
2 | 2018-01-01 00:00:00
3 | 2018-01-01 00:00:00
4 | 2018-01-01 00:00:00
5 | 2017-01-01 00:00:00
6 | 2017-01-01 00:00:00
7 | 2017-01-01 00:00:00
--------------------------
Я сейчас получаю:
table_name | size | table_size
--------------------------------------
"event_run_1" | "23 MB" | "24272896"
"event_run_1" | "167 MB" | "175046656"
Я хочу, чтобы event_run_1 был в списке, но не event_run_2.
PS: Если я слишком усложняю вещи, и можно сделать это без SQL-запросов или чего-то еще, это также может быть решением. Я думаю, что нет других вариантов, где это возможно, из-за: PostgreSQL: время создания таблицы
Я попробовал ответ из Автоматически удалять таблицы и индексы старше 90 дней , которые я получил из этого ответа PostgreSQL: Дата создания таблицы , но получил:
ERROR: must be superuser to get directory listings
SQL state: 42501