Размер печати всех таблиц, созданных за данный год

У меня есть база данных, полная таблиц. Я использую 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

person Agustin Barrachina    schedule 11.01.2019    source источник
comment
Я не понимаю. Какие элементы есть в таблице и чьи идентификаторы вы найдете в timecycle? Ряды?   -  person Laurenz Albe    schedule 11.01.2019
comment
@LaurenzAlbe, timecycle имеет только 2 столбца. Идентификатор и дата. И для ясности, event_run_x имеет только один столбец с идентификатором. Я добавлю пример, чтобы прояснить ситуацию прямо сейчас.   -  person Agustin Barrachina    schedule 11.01.2019


Ответы (1)


Я предлагаю вам использовать для этого таблицы sys. Вы можете легко получить create_date таблицы из sys.tables.

Select * from sys.tables where create_date between '1/1/2018' and '12/31/2018'

Вы можете присоединить этот вывод к любому запросу, который вы предпочитаете, в котором размеры таблиц отображают данные так, как вы хотите. Единственное предостережение в отношении чего-то подобного будет, если вы имеете дело с базой данных, в которой установлены процессы, которые отбрасывают и создают таблицы. Это не является чем-то необычным и может показать вам некоторые результаты, которые вам не нравятся. Вам придется дополнительно отфильтровать любые известные таблицы, попадающие в этот сценарий.

В общем, собрать это не должно быть очень сложно.

person Steven Johnson    schedule 11.01.2019
comment
С этим точным запросом я получаю: ERROR: relation "sys.tables" does not exist. Я пробовал погуглить, но не нашел, почему получаю ошибку ... - person Agustin Barrachina; 11.01.2019
comment
Это работает на MSSQL, у вас работает Oracle или MySQL? - person Steven Johnson; 12.01.2019
comment
Сервер использует PostgreSQL, и я обращаюсь к нему через pgAdmin. - person Agustin Barrachina; 14.01.2019