{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE QuasiQuotes #-} module PGExtras.Queries.TableIndexesSize (tableIndexesSizeSQL, displayTableIndexesSize) where import PGExtras.Helpers (maybeText) import Database.PostgreSQL.Simple import Text.RawString.QQ import qualified Data.Text as Text import Control.Monad (forM_) import Data.List (intercalate) tableIndexesSizeSQL :: Query tableIndexesSizeSQL = [r|SELECT c.relname AS table, pg_size_pretty(pg_indexes_size(c.oid)) AS index_size FROM pg_class c LEFT JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE n.nspname NOT IN ('pg_catalog', 'information_schema') AND n.nspname !~ '^pg_toast' AND c.relkind IN ('r', 'm') ORDER BY pg_indexes_size(c.oid) DESC;|] displayTableIndexesSize :: [(Maybe Text.Text, Maybe Text.Text)] -> IO () displayTableIndexesSize rows = do putStrLn $ description putStrLn $ intercalate " | " tableHeaders forM_ rows $ \(arg1, arg2) -> putStrLn $ maybeText(arg1) ++ " | " ++ maybeText(arg2) description :: [Char] description = "Total size of all the indexes on each table, descending by size" tableHeaders :: [[Char]] tableHeaders = ["name", "indexes_size"]