Queries úteis do PostgreSQL

Listar todas as tabelas, ordenadas por contagem de registros

-- Esta query usa as estatísticas do PostgreSQL para contar.
-- Para números mais precisos, execute
--    VACUUM ANALYZE
-- antes da query.
SELECT
   relname,
   n_live_tup
FROM
   pg_stat_user_tables
ORDER BY
   n_live_tup DESC;

Mostrar todos os índices do banco de dados

Esta query gera comandos create index para todos os índices do banco de dados.

select
   'CREATE INDEX '|| index_name || ' ON ' || table_name || ' ( ' || colunas || ' );'
from
   (select
      table_name,
      index_name,
      array_to_string ( ARRAY (  select
         a.attname as column_name
      from
         pg_class t,
         pg_class i,
         pg_index ix,
         pg_attribute a
      where
         t.oid = ix.indrelid
         and i.oid = ix.indexrelid
         and a.attrelid = t.oid
         and a.attnum = ANY(ix.indkey)
         and t.relkind = 'r'
         and i.relname not like 'fk_%'
         and i.relname not like 'pk_%'
         and i.relname not like '%_pkey'
         and t.relname = base.table_name
         and i.relname = base.index_name
      order by
         t.relname,
         i.relname,
         a.attname ),
      ', ') AS colunas
   from
      (select
         distinct t.relname as table_name,
         i.relname as index_name
      from
         pg_class t,
         pg_class i,
         pg_index ix,
         pg_attribute a
      where
         t.oid = ix.indrelid
         and i.oid = ix.indexrelid
         and a.attrelid = t.oid
         and a.attnum = ANY(
            ix.indkey
         )
         and t.relkind = 'r'
         and i.relname not like 'fk_%'
         and i.relname not like 'pk_%'
         and i.relname not like '%_pkey'
      order by
         t.relname,
         i.relname ) as base) as base2;

Adicionar quebra de linha

SELECT 'First Line' || Chr(13) ||'Second Line';

CHAR(13) é o mesmo que CR. Para seguir a quebra de linha CRLF do Windows, você precisa de CHAR(13)+CHAR(10).

E se a quebra de linha não aparecer?

Ao visualizar usando o psql, ele mostra o \r, que é a representação do caractere de quebra de linha:

resultado usando psql

Quando visualizamos pelo pgAdmin, a quebra é feita, como deveria ser:

resultado usando pgAdmin

E quanto à minha aplicação?

Se você usar essa dica em uma aplicação desenvolvida por você, será necessário tratar o resultado da query e exibir os caracteres de quebra de linha da forma que desejar. Por exemplo, se você está desenvolvendo uma aplicação web, pode, na camada de visualização, substituir as quebras de linha por <br/>.

Espaço em disco

Tamanho da relação, somente dados

SELECT pg_size_pretty(pg_relation_size('actor'));

Tamanho da relação, com índices

SELECT pg_size_pretty(pg_total_relation_size('actor'));

As 20 maiores tabelas

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
  FROM pg_class C
  LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
  WHERE nspname NOT IN ('pg_catalog', 'information_schema')
    AND C.relkind <> 'i'
    AND nspname !~ '^pg_toast'
  ORDER BY pg_total_relation_size(C.oid) DESC
  LIMIT 20;

Use any(array) em vez de IN

Usando regex: 8 segundos em ~3,5 milhões de registros

mydatabase=> SELECT my_column FROM my_table WHERE my_column ~* '^12025550188|^12025550103|^12025550193|^12025550143|^12025550141';
-[ RECORD 1 ]--------------
my_column | 12025550188
-[ RECORD 2 ]--------------
my_column | 12025550103
-[ RECORD 3 ]--------------
my_column | 12025550193
-[ RECORD 4 ]--------------
my_column | 12025550143
-[ RECORD 5 ]--------------
my_column | 12025550141

Time: 8060,375 ms (00:08,060)

Usando any: 3 segundos em ~3,5 milhões de registros

mydatabase=> SELECT my_column FROM my_table WHERE my_column LIKE ANY(array['12025550188%','12025550103%','12025550193%','12025550143%','12025550141%']);
-[ RECORD 1 ]--------------
my_column | 12025550188
-[ RECORD 2 ]--------------
my_column | 12025550103
-[ RECORD 3 ]--------------
my_column | 12025550193
-[ RECORD 4 ]--------------
my_column | 12025550143
-[ RECORD 5 ]--------------
my_column | 12025550141

Time: 3712,223 ms (00:03,712)

Referência: Row and Array Comparisons