У меня есть база данных, полная таблиц. Я использую 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 года)
id из event_run_x
не повторяется в другом event_run_y
(x! = y ofc). Предполагается, что каждый event_run_x
id имеет один и тот же год. Таким образом, если в запросе временного цикла есть идентификатор из, скажем, 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
timecycle
? Ряды? - person Laurenz Albe   schedule 11.01.2019timecycle
имеет только 2 столбца. Идентификатор и дата. И для ясности,event_run_x
имеет только один столбец с идентификатором. Я добавлю пример, чтобы прояснить ситуацию прямо сейчас. - person Agustin Barrachina   schedule 11.01.2019