我有一个充满表的数据库。
我正在使用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
都有许多具有不同ID的元素。在表timecycle
中,我具有相同的ID和名为date
的列。我可以通过以下方式获得2018年的所有ID:
SELECT * FROM timecycle WHERE extract(year from date) = 2018
现在我需要的是更改第一个代码以仅列出具有在最后一个查询中列出的ID的表。 (从时间周期2018年开始)
来自event_run_x
的 id在另一个event_run_y
中不重复(x!= y ofc)。 每个event_run_x
ID应该具有相同的年份。因此,如果在时间周期查询中有一个来自event_run_8
的ID,则来自event_run_8
的所有ID都将在该查询中,反之亦然。
示例:
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: Table creation time
我尝试了从Automatically Drop Tables and Indexes Older than 90 Days那里得到的答案,PostgreSQL: Creation date of a table却得到了:
ERROR: must be superuser to get directory listings
SQL state: 42501
答案 0 :(得分:1)
我建议您利用sys表来解决这个问题。您可以轻松地从sys.tables中获取表的create_date。
Select * from sys.tables where create_date between '1/1/2018' and '12/31/2018'
您可以将该输出连接到您喜欢的任何查询中,该查询具有表大小以所需的方式显示数据。唯一需要注意的事情是,如果您正在处理的数据库中已经建立了删除和创建表的进程。这并非闻所未闻,并且可能会向您显示一些您不喜欢的结果。您将不得不进一步过滤掉属于该场景的任何已知表。
所有这些都应该很容易组合在一起。