Em 25 de outubro de 2011 16:26, Pedro Ivo Bispo França <[email protected]> escreveu: > Em 25 de outubro de 2011 15:31, Dickson S. Guedes <[email protected]> > escreveu: >> Internamente o PostgreSQL cria uma constante com o valor resultante da >> função imutável (quando assim declarada) e utiliza isso dentro do >> próprio plano de execução. >> >> Faça testes com PREPARE e EXECUTE e veja os resultados entre os tipos >> de volatilidade, também. >> > > Cara, pelos testes que fiz aqui, mesmo as IMMUTABLES não se comportam assim > no caso de várias chamadas no statement.
Talvez eu tenha me expressado mal. Veja, quando você marca uma função como IMMUTABLE você está informando ao planejador que esta função não fará qualquer mudança na base de dados de forma que, para o *mesmo valor constante* de entrada nesta função, exista uma outra saída. Esta categoria _permite_ ao otimizador pré-avaliar a função quando uma consulta é chamada com argumentos constantes. Ou seja, permite ao planejador tomar uma decisão. Não quer dizer que será sempre a mesma. Veja, o caso do operador '+', se ele recebe int4 na esquerda e int4 na direita ele vai executar a função immutable 'int4pl', conforme: bdteste=> SELECT oprcode from pg_operator where oprname = '+' and oprright=23 and oprleft=23; oprcode --------- int4pl bdteste=> SELECT provolatile from pg_proc where proname = 'int4pl'; provolatile ------------- i O 'i' ali é de immutable. Logo, uma chamada assim 'SELECT * FROM tabela WHERE codigo = 2 + 2' permite ao planejador fazer um 'folding' modificando-a para um 'SELECT * FROM tabela WHERE codigo = 4', por exemplo, o que é importante principalmente se 'a' for indexado. Se não me fiz entender talvez é porque eu não tenha entendido o seu problema. -- Dickson S. Guedes mail/xmpp: [email protected] - skype: guediz http://guedesoft.net - http://www.postgresql.org.br _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
