Размер печати всех таблиц, созданных за данный год - PullRequest
0 голосов
/ 11 января 2019

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

1 Ответ

0 голосов
/ 11 января 2019

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

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

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

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

...