Skip to main content

Vacuum Analyze Full Schema in PostgreSQL Database

To analyze full database schema, you can use following shell script :

--------------------------------------------------------------------------------------------------------------------------
#!/bin/sh

rm -rf /tmp/vacuum_analyze_MyData.sql

dbname="mydata"
username="mydatadatamart"
namespace="mydatadatamart"

# Vacuum only those tables which are fragmented over 30%
# Analyze tables only if they are not already
# Process CMF and Groups Master table every time as they are master

Tables=`psql $dbname $username << EOF
SELECT 'VACUUM ANALYZE VERBOSE ' || tablename || ' ;' AS TableList
  FROM (
SELECT *,
      n_dead_tup > av_threshold AS "av_needed",
      CASE WHEN reltuples > 0
     THEN round(100.0 * n_dead_tup / (reltuples))
      ELSE 0
      END AS pct_dead
FROM (SELECT
C.relname AS TableName,
pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins,
pg_stat_get_tuples_updated(C.oid) AS n_tup_upd,
pg_stat_get_tuples_deleted(C.oid) AS n_tup_del,
CASE WHEN pg_stat_get_tuples_updated(C.oid) > 0
THEN pg_stat_get_tuples_hot_updated(C.oid)::real / pg_stat_get_tuples_updated(C.oid)
ELSE 0
 END AS HOT_update_ratio,
pg_stat_get_live_tuples(C.oid) AS n_live_tup,
pg_stat_get_dead_tuples(C.oid) AS n_dead_tup,
C.reltuples AS reltuples,
round( current_setting('autovacuum_vacuum_threshold')::integer + current_setting('autovacuum_vacuum_scale_factor')::numeric * C.reltuples) AS av_threshold,
date_trunc('minute',greatest(pg_stat_get_last_vacuum_time(C.oid),pg_stat_get_last_autovacuum_time(C.oid))) AS last_vacuum,
date_trunc('minute',greatest(pg_stat_get_last_analyze_time(C.oid),pg_stat_get_last_analyze_time(C.oid))) AS last_analyze
FROM pg_class C
LEFT JOIN pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
 WHERE C.relkind IN ('r', 't')
   AND N.nspname = '$namespace'
      ) AS av      
    ) AS final
    WHERE final.pct_dead >= 30
OR final.last_vacuum IS NULL
OR final.last_analyze IS NULL;
EOF`

echo $Tables >> /tmp/vacuum_analyze_MyData.sql
sed -i -r 's/[;]+/;\n/g' /tmp/vacuum_analyze_MyData.sql
sed -i '$ d' /tmp/vacuum_analyze_MyData.sql
sed -i -r 's/tablelist//g' /tmp/vacuum_analyze_MyData.sql
sed -i -r 's/[-]+//g' /tmp/vacuum_analyze_MyData.sql

logfile=$PGDATA'/pg_log/vacuum_analyze_MyData_'`date +"%Y-%m-%d_%H-%M-%S"`

echo 'Starting vacuum : '`date` > $logfile
STARTTIME=$(date +%s)
psql -U mydatadatamart -d mydata -f /tmp/vacuum_analyze_MyData.sql >> $logfile 2>&1
ENDTIME=$(date +%s)
ElapseT=`expr $ENDTIME - $STARTTIME`
echo 'Completed Vacuum : '`date`  >> $logfile
echo "It takes $ElapseT seconds to complete this task..." >> $logfile
--------------------------------------------------------------------------------------------------------------------------

Comments

  1. Thank you for your useful script!!
    .. you can fix it addind $dbname at line $59

    ReplyDelete
  2. Spot on with this write-up, I absolutely believe this website needs
    far more attention. I'll probably be back again to read more, thanks for
    the info!

    ReplyDelete
  3. My brother suggested I might like this blog. He was entirely right.
    This post truly made my day. You cann't imagine simply how much time
    I had spent for this info! Thanks!

    ReplyDelete

Post a Comment

Popular posts from this blog

Some facts and Figures of WCF

SOAP Message in WCF: 1.        The max size of SOAP message in WCF is 9,223,372,036,854,775,807 bytes. Including metadata. 2.        For actual user data we can use 2,147,483,647 bytes out of it. 3.        With default setting WCF uses only 65536 bytes. 4.        We can change it by setting maxReceivedMessageSize in clients app.config file.    5.        So selection of data types in Data Contract and Data table will matter a lot! 6.       Reference :   http://blogs.msdn.com/drnick/archive/2006/03/16/552628.aspx          http://blogs.msdn.com/drnick/archive/2006/03/10/547568.aspx       “Amazing blog for WCF!” Data Contract: 1.        By Default WCF can serialize 65536 DataMember. 2.        We can change it to max  2147483646. 3.       How?  Please go to: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4a81a226-175b-41d3-864a-181792c71ffe Tracing WCF service message: 1.       Enable message log of WCF: http://www.avingtonsolutions.com/blog/post/2008/07/25/Tracing-SOAP-Message

Drop all Objects from Schema In Postgres

To Drop all objects from Postgres Schema there could be following two approaches: Drop Schema with cascade all and re-create it again.  In some cases where you dont want to/not allowed to drop and recreate schema, its easy to look for objects on current schema and drop them. following script would help to do so, Create function which would do the task and then drop that function too. --- CREATE OR REPLACE FUNCTION drop_DB_objects() RETURNS VOID AS $$ DECLARE  rd_object RECORD; v_idx_statement VARCHAR(500);   BEGIN ---1. Dropping all stored functions RAISE NOTICE '%', 'Dropping all stored functions...'; FOR rd_object IN ( SELECT format('%I.%I(%s)', ns.nspname, p.proname, oidvectortypes(p.proargtypes)) as functionDef     FROM pg_proc p     INNER JOIN pg_namespace ns ON (p.pronamespace = ns.oid)    WHERE ns.nspname = current_schema      AND p.proname <> 'drop_db_objects' )