Przypis/ZRZECZENIE SIĘ:
To zły pomysł, ponieważ czas tworzenia tabeli nie jest w 100% niezawodny, ponieważ tabela mogła zostać wewnętrznie usunięta i ponownie utworzona z powodu operacji na tabeli, takich jak CLUSTER.
Poza tym możesz uzyskać czas utworzenia w ten sposób (zakładając przykładową nazwę tabeli 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')
Sekret polega na użyciu pg_stat_file w odpowiednim pliku tabeli.
-- 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('.');
Zgodnie z komentarzem w tym poście PostgreSQL:czas utworzenia tabeli nie jest to w 100% niezawodne, ponieważ tabela mogła zostać wewnętrznie usunięta i ponownie utworzona z powodu operacji na tabeli, takich jak CLUSTER.
Również wzór
/main/base/<database id>/<table filenode id>
wydaje się być błędny, ponieważ na moim komputerze wszystkie tabele z różnych baz danych mają ten sam identyfikator bazy danych i wygląda na to, że folder został zastąpiony dowolnym numerem węzła, więc musisz znaleźć folder, którego numer jest najbliższy numerowi twojej tabeli identyfikator i-węzła (maksymalna nazwa folderu, gdzie identyfikator folderu <=identyfikator_in-węzła_tabeli i nazwa folderu to liczba)
Wersja uproszczona wygląda tak:
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')
)
Następnie możesz użyć information_schema i cte, aby uprościć zapytanie, lub utworzyć własny widok:
;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
(wszystkie tabele utworzone za pomocą schematu nhibernate tworzą, więc mniej więcej ten sam czas na wszystkich tabelach na zrzucie ekranu jest poprawny).
W przypadku ryzyka i skutków ubocznych użyj mózgu i / lub zapytaj lekarza lub farmaceutę;)