Sidenote/DISCLAIMER:
Dette er en dårlig idé, da tabeloprettelsestidspunktet ikke er 100 % pålideligt, fordi bordet kan være blevet internt droppet og genskabt på grund af operationer på bordet, såsom CLUSTER.
Bortset fra det, kan du få oprettelsestiden som denne (forudsat eksempel-tabel-navn på t_benutzer
):
--select datname, datdba from pg_database;
--select relname, relfilenode from pg_class where relname ilike 't_benutzer';
-- (select relfilenode::text from pg_class where relname ilike 't_benutzer')
SELECT
pg_ls_dir
,
(
SELECT creation
FROM pg_stat_file('./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || pg_ls_dir
)
) as createtime
FROM pg_ls_dir(
'./base/' ||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
)
WHERE pg_ls_dir = (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
Hemmeligheden er at bruge pg_stat_file på den respektive tabelfil.
-- http://www.greenplumdba.com/greenplum-dba-faq/howtofindtablecreationdateingreenplum
select
pg_ls_dir
,
(
select
--size
--access
--modification
--change
creation
--isdir
from pg_stat_file(pg_ls_dir)
) as createtime
from pg_ls_dir('.');
Som i kommentaren i dette indlæg PostgreSQL:Tid til oprettelse af tabel dette er ikke 100 % pålideligt, fordi tabellen kan være blevet slettet internt og genskabt på grund af operationer på bordet, såsom CLUSTER.
Også mønsteret
/main/base/<database id>/<table filenode id>
ser ud til at være forkert, da alle tabeller fra forskellige databaser på min maskine har samme database-id, og det ser ud til at mappen er blevet erstattet med et eller andet vilkårligt inodenummer, så du skal finde den mappe, hvis nummer er tættest på din tabels inode-id (maks. mappenavn, hvor mappe-id <=tabel_inode_id og mappenavn er numerisk)
Forenklet version ser sådan ud:
SELECT creation
FROM pg_stat_file(
'./base/'
||
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE 't_benutzer')
)
|| '/' || (SELECT relfilenode::text FROM pg_class WHERE relname ILIKE 't_benutzer')
)
Så kan du bruge information_schema og cte til at gøre forespørgslen enkel, eller oprette din egen visning:
;WITH CTE AS
(
SELECT
table_name
,
(
SELECT
MAX(pg_ls_dir::bigint)::text
FROM pg_ls_dir('./base')
WHERE pg_ls_dir <> 'pgsql_tmp'
AND pg_ls_dir::bigint <= (SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name)
) as folder
,(SELECT relfilenode FROM pg_class WHERE relname ILIKE table_name) filenode
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema = 'public'
)
SELECT
table_name
,(
SELECT creation
FROM pg_stat_file(
'./base/' || folder || '/' || filenode
)
) as creation_time
FROM CTE
(alle tabeller oprettet med nhibernate skema oprettes, så den mere eller mindre samme tid på alle tabeller på skærmbilledet er korrekt).
For risiko og bivirkninger, brug din hjerne og/eller spørg din læge eller apotek;)