補足/免責事項:
テーブルの作成時間は100%信頼できるわけではないため、これは悪い考えです。これは、CLUSTERなどのテーブルの操作により、テーブルが内部で削除されて再作成された可能性があるためです。
それとは別に、次のように作成時間を取得できます(example-table-nameの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')
秘訣は、それぞれのテーブルファイルでpg_stat_fileを使用することです。
-- 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('.');
この投稿のコメントによると、 PostgreSQL:テーブルの作成時間 CLUSTERなどのテーブルの操作により、テーブルが内部的に削除されて再作成された可能性があるため、これは100%信頼できるわけではありません。
また、パターン
/main/base/<database id>/<table filenode id>
私のマシンでは、異なるデータベースのすべてのテーブルのデータベースIDが同じであり、フォルダが任意のiノード番号に置き換えられているように見えるため、テーブルの番号に最も近い番号のフォルダを見つける必要があります。 iノードID(folderid <=table_inode_idおよびfoldernameが数値である最大foldername)
簡略化されたバージョンは次のようになります:
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')
)
次に、information_schemaとcteを使用してクエリを単純にするか、独自のビューを作成できます。
;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
(nhibernateスキーマで作成されたすべてのテーブルが作成されるため、スクリーンショットのすべてのテーブルでほぼ同時に正しいです)。
リスクと副作用については、脳を使用するか、医師または薬剤師に相談してください;)