Re: [pgbr-geral] Duvida sobre sequence

2013-12-16 Por tôpico Matheus de Oliveira
2013/12/15 Guimarães Faria Corcete DUTRA, Leandro l...@dutras.org

 2013/12/15 Wellington wm...@yahoo.com.br:
 
  tenho uma duvida: Eh possivel fazer uma consulta das sequencias que nao
  estao sendo utilizadas em nenhuma tabela ?

 Sim, pelo catálogo, como sempre.  Pense MINUS.




Exatamente. Se quisermos verificar as sequências que não estão no valor
padrão (default) de um atributo, podemos relacionar a pg_class para
recuperar todas as sequências (são aquelas cujo atributo relkind = 'S') com
a tabela pg_attrdef que possui o padrão de um campo (atributo adsrc). Por
exemplo:

SELECT r.oid::regclass
FROM pg_class r LEFT JOIN pg_attrdef d ON d.adsrc LIKE
'%'||(r.oid::regclass::text)||'%'
WHERE r.relkind = 'S' AND d.oid IS NULL;

Ao menos que use nomes estranhos em suas sequências, esta consulta
funcionará perfeitamente.



   Pelo que percebi, ao excluir uma tabela, a sequencia associada a ela
 nao é
  excluida.

 Porque não há associação de fato.  Uma seqüência pode servir várias
 tabelas, ou nenhuma.


Bem, não é **exatamente** assim. Por exemplo, quando cria-se uma sequência
utilizando o pseudo-tipo serial, o PostgreSQL irá sim associar a sequência
a uma tabela (na verdade ao atributo da tabela, e somente a um). Vejam o
exemplo:

postgres=# CREATE TABLE seq_test(a serial);
CREATE TABLE
== a sequência foi *criada* implicitamente
postgres=# SELECT nextval('seq_test_a_seq');
 nextval
-
   1
(1 row)

postgres=# DROP TABLE seq_test;
DROP TABLE
== a sequência foi *excluída* implicitamente
postgres=# SELECT nextval('seq_test_a_seq');
ERROR:  relation seq_test_a_seq does not exist
LINE 1: SELECT nextval('seq_test_a_seq');

Essa associação é feita usando o OWNED BY nos comandos CREATE/ALTER
SEQUENCE. Por exemplo, o código acima é exatamente equivalente a:

CREATE SEQUENCE seq_test_a_seq;
CREATE TABLE seq_test(a integer not null default
nextval('seq_test_a_seq'));
ALTER SEQUENCE seq_test_a_seq OWNED BY seq_test.a;

Com isso, a sequência passa a estar associada à tabela seq_test e
atributo a.

A vantagem é que, além de uma deleção da tabela também remover a sequência,
podemos forçar o TRUNCATE a zerar a sequência:

TRUNCATE seq_test RESTART IDENTITY;

Houve uma discussão sobre isso ano passado, e cheguei a criar uma consulta
para pegar as sequências e suas associações [1]. A mesma pode ser adaptada
para recuperar as sequências que não estão associadas a nenhum atributo (em
geral elas deveriam, mas não é uma regra):

SELECT s.oid::regclass AS sequence
FROM pg_class s
LEFT JOIN pg_depend d ON s.oid = d.objid AND d.deptype = 'a'
 LEFT JOIN pg_class t ON d.refobjid = t.oid
 LEFT JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum =
d.refobjsubid
WHERE s.relkind = 'S' AND t.oid IS NULL;


[1]
http://listas.postgresql.org.br/pipermail/pgbr-geral/2012-August/031827.html

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Duvida sobre sequence

2013-12-16 Por tôpico Guimarães Faria Corcete DUTRA , Leandro
2013/12/16 Matheus de Oliveira matioli.math...@gmail.com:

 Porque não há associação de fato.  Uma seqüência pode servir várias
 tabelas, ou nenhuma.

 Bem, não é **exatamente** assim. Por exemplo, quando cria-se uma sequência
 utilizando o pseudo-tipo serial, o PostgreSQL irá sim associar a sequência a
 uma tabela (na verdade ao atributo da tabela, e somente a um).

Isso é que dá ficar desatualizado… obrigado!



 Essa associação é feita usando o OWNED BY nos comandos CREATE/ALTER
 SEQUENCE.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] VACUUM FREEZE - Tuplas Congeladas

2013-12-16 Por tôpico Mariana Hansen
Em 13 de dezembro de 2013 15:17, Flavio Henrique Araque Gurgel 
fha...@gmail.com escreveu:

 Deixe-me ver se entendi.
 O congelamento evita que os XIDs sejam mudados ao início de um novo
 ciclo de numeração de XIDs, pq caso contrário teriam um XID inferior a
 transações mais antigas?
 Simples assim? :)


 Na verdade é bem o contrário.
 A opção FREEZE vai fazer com que a idade mínima da tabela toda seja zero.
 Logo, quando o contador voltar a zero, não haverá problemas.

 Essa opção é agressiva e a operação vai tomar bastante tempo. Evite-a.
 Caso você tenha alguma suspeita de que um autovacuum forçado esteja
 rodando, ajustar a opção vacuum_freeze_min_age é a melhor ideia. Mas isso
 normalmente só é necessário quando o autovacuum está desligado, o que é
 péssimo de se fazer.

 De acordo com a documentação, a opção FREEZE deverá ser removida em alguma
 próxima versão do PostgreSQL.



Uma coisa interessante:

The FREEZE option is deprecated and will be removed in a future release;
set the parameter instead.  [1]

Como vc mencionou consta até a documentação da versão 9.0. [1]
Da 9.1 em diante o aviso foi retirado. [2]


[1] http://www.postgresql.org/docs/9.0/static/sql-vacuum.html

[2] http://www.postgresql.org/docs/9.1/static/sql-vacuum.html






 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral