sql >> Databasteknik >  >> RDS >> PostgreSQL

Släpp automatiskt tabeller och index äldre än 90 dagar

Sidenote/DISCLAIMER:
Detta är en dålig idé, eftersom tidpunkten för skapandet av tabeller inte är 100 % tillförlitlig, eftersom tabellen kan ha tappats internt och återskapats på grund av operationer på bordet, såsom CLUSTER.

Bortsett från det kan du få skapelsetiden så här (förutsatt att exempel-tabellnamn för 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')

Hemligheten är att använda pg_stat_file på respektive tabellfil.

-- 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('.'); 

Enligt kommentaren i det här inlägget PostgreSQL:tid för tabellskapande detta är inte 100 % tillförlitligt, eftersom tabellen kan ha tappats internt och återskapats på grund av operationer på bordet, till exempel CLUSTER.

Även mönstret

/main/base/<database id>/<table filenode id> 

verkar vara fel, som på min maskin har alla tabeller från olika databaser samma databas-id, och det verkar som om mappen har ersatts med något godtyckligt inodnummer, så du måste hitta den mapp vars nummer är närmast din tabells inode-id (max mappnamn där mapp-id <=table_inode_id och mappnamn är numeriskt)

Förenklad version ser ut så här:

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')
)

Sedan kan du använda information_schema och cte för att göra frågan enkel, eller skapa din egen vy:

;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 

(alla tabeller skapade med nhibernate-schema skapar, så ungefär samma tid på alla tabeller på skärmdumpen är korrekt).

För risker och biverkningar, använd din hjärna och/eller fråga din läkare eller apotekspersonal;)



  1. SQL Server Performance TOP IO Query -2

  2. Gå igenom loopen för att hitta upprepade namn

  3. Heroku Postgres:För många kontakter. Hur dödar jag dessa anslutningar?

  4. Infoga en rad och undvik rastillstånd (PHP/MySQL)