Thiago :A solução efetiva não é bem esta. O problema é que você está fazendo um "count" .<<<SELECT INTO res COUNT(cpf) as num_cpf<<<FROM candidato WHERE cpf = ncpf AND id_candidato != id_cand;Mesmo com índice parcial o postgres vai acessar mais registros do que é necessário !O melhor seria fazer alguma coisa parecida com :IF new.cpf is not null THENIF EXISTS(select 1 from candidato where new.cpf= cpf ) THENRAISE EXCEPTION ..............................Gaspar at inforep.com.brVocê considerou a possibilidade de criação de um índice parcial?CREATE UNIQUE INDEX seu_indice_parcial ON candidato (ncpf)
WHERE (ncpf != '' AND ncpf
NOTNULL);
[]sOsvaldo
P.S. Isto não ajudará nos "UPDATES GERAIS". Avalie com um EXPLAIN ANALYZE o plano de execução de um update sem cláusula where.
Creio que a criação de um índice UNIQUE como sugerido acima é efetiva pois qualquer tentativa de inclusão de um cpf já existente, ou alteração para um cpf já existente, provocaria um erro no comando, não havendo necessidade, portanto, da trigger para verificar a existência do cpf, o próprio PostgreSQL cuidaria disso.
[]s
Osvaldo
Yahoo! doce lar. Faça do Yahoo! sua homepage.
_______________________________________________ Grupo de Usuários do PostgreSQL no Brasil http://www.postgresql.org.br
