Re: [pgbr-geral] duvida de uma consulta

2013-08-06 Por tôpico Matheus de Oliveira
2013/8/4 lucas . lucasouz...@hotmail.com

 Ola gente, tenho uma dúvida.

 Usando esta consulta

 SELECT *

 FROM Auth, Publ

 WHERE Auth.pubID = Publ.pubID AND Auth.nome = 'Surajit Chaudhuri'



 índices primários sobre Auth.pubID e Publ.pubID e índice secundário sobre
 Auth.nome.


 O algoritmo escolhido pelo postgre sera o Nested loop. Entendo que ele faz
 esta escolha pelo fato da seleção ser feita antes da junção dessa forma o
 desempenho da junção será melhor com o nested. Confirma?



Em geral, o PostgreSQL tende a usar o nested loop quando está trabalhando
com um conjunto pequeno de dados (pelo menos dos vindos da tabela da
direita), mas veja que a definição de pequeno vai depender dos custos
definidos. Nesse caso o filtro em Auth.nome pode sim explicar essa
escolha. Poste o resultado do seguinte comando para te darmos uma resposta
mais certeira:

ANALYZE Auth;
ANALYZE Publ;
EXPLAIN ANALYZE SELECT *
FROM Auth, Publ
WHERE Auth.pubID = Publ.pubID AND Auth.nome = 'Surajit Chaudhuri'



  E outra dúvida, no pgadmin aonde que eu posso olhar a PEC da consulta?


PEC seria o quê? Plano de execução? Acho que ele tem um botão para executar
e mostrar, mas você também pode usar o EXPLAIN (como acima).


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 de uma consulta

2013-08-06 Por tôpico Matheus de Oliveira
2013/8/4 lucas . lucasouz...@hotmail.com

 do postgre

 E eu estou enviando pelo meu email as respostas acho que por isto esta
 bagunçando a lista. Poderia me enviar o link da lista? ja perdi


Pode enviar por e-mail mesmo, mas edite a resposta colocando sua abaixo da
resposta do anterior. Como estou fazendo aqui.

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] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Fábio Telles Rodriguez
Marcelo, lamento lhe informar mas você está fazendo isso do jeito
errado. Não é que sua função não funcione, mas por princípio não
devemos substituir um SQL puro por um PL. Quando você faz isso, o
otimizador de desempenho do postgres vai para o vinagre. Além disso,
você declarou sua função como VOLATILE. Se declarar como IMMUTABLE,
veria ganhos imediatos, vide:
http://www.postgresql.org/docs/current/static/sql-createfunction.html

Eu escrevi um pouco sobre como trabalhar com datas aqui:
http://savepoint.blog.br/brincando-com-algumas-funcoes-com-data-no-postgresql/

2013/8/5 Marcelo da Silva marc...@ig.com.br:
 Desculpa estava esquecendo de uma linha...

 Agora está OK

 -- Function: fproxdiautil(date)

 -- DROP FUNCTION fproxdiautil(date);

 CREATE OR REPLACE FUNCTION fdiasuteis(pData date, pDias integer)
   RETURNS date AS
 $BODY$
 declare
   Dia integer;
   SomaDias integer;
   NovaData date;
 Begin
   SomaDias = 0;
   NovaData = pData;
   while (SomaDias  pDias) loop
 NovaData = NovaData + 1;
 Dia = extract(dow from NovaData);
 while (Dia = 0 or Dia = 6) loop
   NovaData = NovaData + 1;
   Dia = extract(dow from NovaData);
 end loop;
 SomaDias = SomaDias + 1;
   end loop;
   return fproxdiautil(NovaData);
 end;
 $BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;
 ALTER FUNCTION fdiasuteis(date, integer)
   OWNER TO postgres;


 Marcelo Silva

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




-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Marcelo da Silva
Valeu Fabio..., como eu citei eu não manjo, mas aqui tenho que fazer papel
de DBA e tudo mais, sabcomé, então nem sobra tempo pra estudar essas
funções detalhadamente, as dicas aqui da lista são excelentes...
Vou tratar de mudar a função :)

Mais uma vez, muito obrigado...


Em 6 de agosto de 2013 08:50, Fábio Telles Rodriguez fabio.tel...@gmail.com
 escreveu:

 Marcelo, lamento lhe informar mas você está fazendo isso do jeito
 errado. Não é que sua função não funcione, mas por princípio não
 devemos substituir um SQL puro por um PL. Quando você faz isso, o
 otimizador de desempenho do postgres vai para o vinagre. Além disso,
 você declarou sua função como VOLATILE. Se declarar como IMMUTABLE,
 veria ganhos imediatos, vide:
 http://www.postgresql.org/docs/current/static/sql-createfunction.html

 Eu escrevi um pouco sobre como trabalhar com datas aqui:

 http://savepoint.blog.br/brincando-com-algumas-funcoes-com-data-no-postgresql/

 2013/8/5 Marcelo da Silva marc...@ig.com.br:
  Desculpa estava esquecendo de uma linha...
 
  Agora está OK
 
  -- Function: fproxdiautil(date)
 
  -- DROP FUNCTION fproxdiautil(date);
 
  CREATE OR REPLACE FUNCTION fdiasuteis(pData date, pDias integer)
RETURNS date AS
  $BODY$
  declare
Dia integer;
SomaDias integer;
NovaData date;
  Begin
SomaDias = 0;
NovaData = pData;
while (SomaDias  pDias) loop
  NovaData = NovaData + 1;
  Dia = extract(dow from NovaData);
  while (Dia = 0 or Dia = 6) loop
NovaData = NovaData + 1;
Dia = extract(dow from NovaData);
  end loop;
  SomaDias = SomaDias + 1;
end loop;
return fproxdiautil(NovaData);
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
  ALTER FUNCTION fdiasuteis(date, integer)
OWNER TO postgres;
 
 
  Marcelo Silva
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 



 --
 Atenciosamente,
 Fábio Telles Rodriguez
 blog: http://savepoint.blog.br
 e-mail / gtalk / MSN: fabio.tel...@gmail.com
 Skype: fabio_telles

 Timbira - A empresa brasileira de Postgres
 http://www.timbira.com.br
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
Marcelo Silva

Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Evitar duplicidade no cadastro de faixas de ceps

2013-08-06 Por tôpico Fábio Telles Rodriguez
Em 20 de julho de 2013 20:30, Danilo Silva
danilo.dsg.go...@gmail.com escreveu:
 Pessoal,

 Tenho uma tabela de cadastro de faixas de ceps
 (cliente,cepinicial,cepfinal), onde não é permitido duplicidade de faixas
 para o mesmo cliente e que uma faixa fique dentro de outra, exemplo:

 Correto
 codigo | cliente | cepinicial | cepfinal
 +-++--
   1 |   1 | 0100   | 0159
   2 |   1 | 0200   | 0299
   3 |   1 | 0300   | 0499
 (3 rows)


 Errado
 codigo | cliente | cepinicial | cepfinal
 +-++--
   1 |   1 | 0100   | 0159
   2 |   1 | 0200   | 0299
   3 |   1 | 0250   | 0499
 (3 rows)


 Errado pois o cep 0250 já existe dentro da faixa anterior. Atualmente eu
 bloqueio o insert na aplicação e criei uma regra com *DO INSTEAD NOTHING*
 para evitar a duplicidade. Qual a melhor forma de evitar esses tipos de
 duplicidade, ou está certo da forma que está?


Bom mesmo para resolver este problema seria usar range datatype. Ele
já faz isso automaticamente para você:
http://www.postgresql.org/docs/current/static/rangetypes.html


 []s
 Danilo

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




-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Marcelo da Silva
Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar a
verificação em cada select do que ter uma função pra isso? Não entendi.


Em 6 de agosto de 2013 08:54, Marcelo da Silva marc...@ig.com.br escreveu:

 Valeu Fabio..., como eu citei eu não manjo, mas aqui tenho que fazer papel
 de DBA e tudo mais, sabcomé, então nem sobra tempo pra estudar essas
 funções detalhadamente, as dicas aqui da lista são excelentes...
 Vou tratar de mudar a função :)

 Mais uma vez, muito obrigado...


 Em 6 de agosto de 2013 08:50, Fábio Telles Rodriguez 
 fabio.tel...@gmail.com escreveu:

 Marcelo, lamento lhe informar mas você está fazendo isso do jeito
 errado. Não é que sua função não funcione, mas por princípio não
 devemos substituir um SQL puro por um PL. Quando você faz isso, o
 otimizador de desempenho do postgres vai para o vinagre. Além disso,
 você declarou sua função como VOLATILE. Se declarar como IMMUTABLE,
 veria ganhos imediatos, vide:
 http://www.postgresql.org/docs/current/static/sql-createfunction.html

 Eu escrevi um pouco sobre como trabalhar com datas aqui:

 http://savepoint.blog.br/brincando-com-algumas-funcoes-com-data-no-postgresql/

 2013/8/5 Marcelo da Silva marc...@ig.com.br:
  Desculpa estava esquecendo de uma linha...
 
  Agora está OK
 
  -- Function: fproxdiautil(date)
 
  -- DROP FUNCTION fproxdiautil(date);
 
  CREATE OR REPLACE FUNCTION fdiasuteis(pData date, pDias integer)
RETURNS date AS
  $BODY$
  declare
Dia integer;
SomaDias integer;
NovaData date;
  Begin
SomaDias = 0;
NovaData = pData;
while (SomaDias  pDias) loop
  NovaData = NovaData + 1;
  Dia = extract(dow from NovaData);
  while (Dia = 0 or Dia = 6) loop
NovaData = NovaData + 1;
Dia = extract(dow from NovaData);
  end loop;
  SomaDias = SomaDias + 1;
end loop;
return fproxdiautil(NovaData);
  end;
  $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
  ALTER FUNCTION fdiasuteis(date, integer)
OWNER TO postgres;
 
 
  Marcelo Silva
 
  ___
  pgbr-geral mailing list
  pgbr-geral@listas.postgresql.org.br
  https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
 



 --
 Atenciosamente,
 Fábio Telles Rodriguez
 blog: http://savepoint.blog.br
 e-mail / gtalk / MSN: fabio.tel...@gmail.com
 Skype: fabio_telles

 Timbira - A empresa brasileira de Postgres
 http://www.timbira.com.br
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 Marcelo Silva
 
 Desenvolvedor Delphi / PHP
 My Postgres database
 Cel.: (11) 99693-4251




-- 
Marcelo Silva

Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Fábio Telles Rodriguez
Em 6 de agosto de 2013 08:56, Marcelo da Silva marc...@ig.com.br escreveu:
 Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar a
 verificação em cada select do que ter uma função pra isso? Não entendi.

A regra de ouro é: se dá para fazer com SQL puro, não faça com PL.
Quando você manda um comando para um SGDB, seja Postgres, SQL Server,
Oracle, DB2 ou até o Mysql... eles tentam executar o seu comando da
forma mais eficiente possível. Se você manda uma consulta envolvendo
varias tabelas, ele vai avaliar em que ordem ele vai pegar as tabelas
para executar a sua consulta.

Quando você utiliza o PL, o otimizador perde a sua autonomia em favor
da sua lógica de programação. Claro que se sua função é do tipo
IMMUTABLE, isso não é tão importante, afinal, você não está
consultando nenhuma tabela. Mas a sua função vai invariavelmente
aparecer dentro de um SQL e aí as coisas vão se complicando.
-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Marcelo da Silva
O mais importante deixei de lado:

Quando devo usar

VOLATILE
IMMUTABLE
STABLE

?


Em 6 de agosto de 2013 10:22, Marcelo da Silva marc...@ig.com.br escreveu:

 Fabio, desculpa aproveitar da sua bondade, mas como cuido de muita coisa
 aqui, fica meio dificil assimilar algumas coisas no postgres, sei que para
 isso seria bom fazer um cursinho, mesmo que rápido em DBA Postgres, mas
 sabcome né, então eu lhe pergunto quais as diferenças entre IMMUTABLE,
 VOLATILE, e STABLE ?
 Li no manual, mas confeço que fiquei meio confuso, pois ele se refere a
 dados vindos de tabelas ou não, e ao mesmo tempo cita que os dados podem
 ser mudados ou não, não compreendi, pois na minha concepção a volatilidade
 dos dados dependeriam dos dados de entrada também, então o que torna uma
 função volatil ou não ? Pelo meu ver toda função seria volatil, a menos que
 se guardasse o resultado em alguma variavel ou tabela, sei lá...


 Em 6 de agosto de 2013 09:36, Fábio Telles Rodriguez 
 fabio.tel...@gmail.com escreveu:

 Em 6 de agosto de 2013 08:56, Marcelo da Silva marc...@ig.com.br
 escreveu:
  Outro detalhe, relendo seu Post, você está dizendo que é melhor
 utilizar a
  verificação em cada select do que ter uma função pra isso? Não entendi.

 A regra de ouro é: se dá para fazer com SQL puro, não faça com PL.
 Quando você manda um comando para um SGDB, seja Postgres, SQL Server,
 Oracle, DB2 ou até o Mysql... eles tentam executar o seu comando da
 forma mais eficiente possível. Se você manda uma consulta envolvendo
 varias tabelas, ele vai avaliar em que ordem ele vai pegar as tabelas
 para executar a sua consulta.

 Quando você utiliza o PL, o otimizador perde a sua autonomia em favor
 da sua lógica de programação. Claro que se sua função é do tipo
 IMMUTABLE, isso não é tão importante, afinal, você não está
 consultando nenhuma tabela. Mas a sua função vai invariavelmente
 aparecer dentro de um SQL e aí as coisas vão se complicando.
 --
 Atenciosamente,
 Fábio Telles Rodriguez
 blog: http://savepoint.blog.br
 e-mail / gtalk / MSN: fabio.tel...@gmail.com
 Skype: fabio_telles

 Timbira - A empresa brasileira de Postgres
 http://www.timbira.com.br
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 Marcelo Silva
 
 Desenvolvedor Delphi / PHP
 My Postgres database
 Cel.: (11) 99693-4251




-- 
Marcelo Silva

Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Emerson Hermann
Não se atende a sua necessidade, mas vou tentar ...

Função para dias úteis, acrescentei também a tabela feriado conforme script
abaixo:


--DROP FUNCTION usf_prox_dia_util (data_inicialx date, diasx integer);
CREATE OR REPLACE FUNCTION usf_prox_dia_util (data_inicialx date, diasx
integer)
RETURNS date AS
$BODY$

SELECT max(dia::date)
  FROM
 (
 SELECT (data_inicialx+s.a*'1 day'::INTERVAL) AS dia
   FROM generate_series(0, (data_inicialx + diasx) - data_inicialx, 1
 ) AS s(a)) foo
 WHERE extract(dow FROM dia) BETWEEN 1 AND 5

EXCEPT

 SELECT data
   FROM feriado

$BODY$
LANGUAGE 'sql';





Em 6 de agosto de 2013 09:36, Fábio Telles Rodriguez fabio.tel...@gmail.com
 escreveu:

 Em 6 de agosto de 2013 08:56, Marcelo da Silva marc...@ig.com.br
 escreveu:
  Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar
 a
  verificação em cada select do que ter uma função pra isso? Não entendi.

 A regra de ouro é: se dá para fazer com SQL puro, não faça com PL.
 Quando você manda um comando para um SGDB, seja Postgres, SQL Server,
 Oracle, DB2 ou até o Mysql... eles tentam executar o seu comando da
 forma mais eficiente possível. Se você manda uma consulta envolvendo
 varias tabelas, ele vai avaliar em que ordem ele vai pegar as tabelas
 para executar a sua consulta.

 Quando você utiliza o PL, o otimizador perde a sua autonomia em favor
 da sua lógica de programação. Claro que se sua função é do tipo
 IMMUTABLE, isso não é tão importante, afinal, você não está
 consultando nenhuma tabela. Mas a sua função vai invariavelmente
 aparecer dentro de um SQL e aí as coisas vão se complicando.
 --
 Atenciosamente,
 Fábio Telles Rodriguez
 blog: http://savepoint.blog.br
 e-mail / gtalk / MSN: fabio.tel...@gmail.com
 Skype: fabio_telles

 Timbira - A empresa brasileira de Postgres
 http://www.timbira.com.br
 ___
 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


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Claudio Bezerra Leopoldino
Assunto: Re: [pgbr-geral]   Fwd: Funcão para contar dias uteis



Fabio, desculpa aproveitar da sua bondade, mas como cuido de muita coisa aqui, 
fica meio dificil assimilar algumas coisas no postgres, sei que para isso 
seria bom fazer um cursinho, mesmo que rápido em DBA Postgres, mas sabcome 
né, então eu lhe pergunto quais as diferenças entre IMMUTABLE, VOLATILE, e 
STABLE ? 
Li no manual, mas confeço que fiquei meio confuso, pois ele se refere a dados 
vindos de tabelas ou não, e ao mesmo tempo cita que os dados podem ser mudados 
ou não, não compreendi, pois na minha concepção a volatilidade dos dados 
dependeriam dos dados de entrada também, então o que torna uma função volatil 
ou não ? Pelo meu ver toda função seria volatil, a menos que se guardasse o 
resultado em alguma variavel ou tabela, sei lá... 

Veja os exemplos deste post: 

 
http://postgresqlbr.blogspot.com.br/2012/08/categorias-de-volatilidade-de-funcoes.html

Cordialmente,

Cláudio




Em 6 de agosto de 2013 09:36, Fábio Telles Rodriguez fabio.tel...@gmail.com 
escreveu:

Em 6 de agosto de 2013 08:56, Marcelo da Silva marc...@ig.com.br escreveu:

 Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar a
 verificação em cada select do que ter uma função pra isso? Não entendi.

A regra de ouro é: se dá para fazer com SQL puro, não faça com PL.
Quando você manda um comando para um SGDB, seja Postgres, SQL Server,
Oracle, DB2 ou até o Mysql... eles tentam executar o seu comando da
forma mais eficiente possível. Se você manda uma consulta envolvendo
varias tabelas, ele vai avaliar em que ordem ele vai pegar as tabelas
para executar a sua consulta.

Quando você utiliza o PL, o otimizador perde a sua autonomia em favor
da sua lógica de programação. Claro que se sua função é do tipo
IMMUTABLE, isso não é tão importante, afinal, você não está
consultando nenhuma tabela. Mas a sua função vai invariavelmente
aparecer dentro de um SQL e aí as coisas vão se complicando.

--
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral



-- 

Marcelo Silva

Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
___
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


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Fábio Telles Rodriguez
Em 6 de agosto de 2013 10:22, Marcelo da Silva marc...@ig.com.br escreveu:
 Fabio, desculpa aproveitar da sua bondade, mas como cuido de muita coisa
 aqui, fica meio dificil assimilar algumas coisas no postgres, sei que para
 isso seria bom fazer um cursinho, mesmo que rápido em DBA Postgres, mas
 sabcome né, então eu lhe pergunto quais as diferenças entre IMMUTABLE,
 VOLATILE, e STABLE ?
 Li no manual, mas confeço que fiquei meio confuso, pois ele se refere a
 dados vindos de tabelas ou não, e ao mesmo tempo cita que os dados podem ser
 mudados ou não, não compreendi, pois na minha concepção a volatilidade dos
 dados dependeriam dos dados de entrada também, então o que torna uma função
 volatil ou não ? Pelo meu ver toda função seria volatil, a menos que se
 guardasse o resultado em alguma variavel ou tabela, sei lá...

Vamos lá...

Uma função é imutável se os dados que ela vai retornar dependem apenas
dos dados passados na chamada da função. Ou seja: você pode alterar os
dados de qualquer tabela que o resultado da função não muda. Imagine
que você chame a função soma(x + y). Não importa o conteúdo das suas
tabelas, se x= 2 e y=3 o resultado sempre será 5. Sacou?

Uma função estável consulta dados de uma ou mais tabela, mas não altera nada.

Uma função volátil como atualiza_estoque(item, quantidade) já realiza
um UPDATE, INSERT ou DELETE em algum tabela.

Saber classificar direito uma função é importante, pois o Postgres
conseguem otimizar de maneira mais agressiva funções estáveis e
imutáveis. No entanto se você tiver uma função volátil criada com
imutável, ela não vai funcionar direito.
-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Marcelo da Silva
Hum... show, ali está bem explicado...

Vou analisar minhas funções...

Só um comentário achei estranho, no inicio ele diz que:
O lado negativo de se empregar funções no Postgres ou em qualquer SGBD é a
necessidade de um tempo significativo de processamento
Eu sempre vi as funções dentro do banco como uma virtude justamente pelo
ganho de processamento.

Será que estou errado denovo?




Em 6 de agosto de 2013 10:34, Claudio Bezerra Leopoldino 
claudiob...@yahoo.com.br escreveu:

 *Assunto:* Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

 Fabio, desculpa aproveitar da sua bondade, mas como cuido de muita coisa
 aqui, fica meio dificil assimilar algumas coisas no postgres, sei que para
 isso seria bom fazer um cursinho, mesmo que rápido em DBA Postgres, mas
 sabcome né, então eu lhe pergunto quais as diferenças entre IMMUTABLE,
 VOLATILE, e STABLE ?
 Li no manual, mas confeço que fiquei meio confuso, pois ele se refere a
 dados vindos de tabelas ou não, e ao mesmo tempo cita que os dados podem
 ser mudados ou não, não compreendi, pois na minha concepção a volatilidade
 dos dados dependeriam dos dados de entrada também, então o que torna uma
 função volatil ou não ? Pelo meu ver toda função seria volatil, a menos que
 se guardasse o resultado em alguma variavel ou tabela, sei lá...

 Veja os exemplos deste post:


 http://postgresqlbr.blogspot.com.br/2012/08/categorias-de-volatilidade-de-funcoes.html

 Cordialmente,

 Cláudio


 Em 6 de agosto de 2013 09:36, Fábio Telles Rodriguez 
 fabio.tel...@gmail.com escreveu:

 Em 6 de agosto de 2013 08:56, Marcelo da Silva marc...@ig.com.br
 escreveu:
  Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar
 a
  verificação em cada select do que ter uma função pra isso? Não entendi.

 A regra de ouro é: se dá para fazer com SQL puro, não faça com PL.
 Quando você manda um comando para um SGDB, seja Postgres, SQL Server,
 Oracle, DB2 ou até o Mysql... eles tentam executar o seu comando da
 forma mais eficiente possível. Se você manda uma consulta envolvendo
 varias tabelas, ele vai avaliar em que ordem ele vai pegar as tabelas
 para executar a sua consulta.

 Quando você utiliza o PL, o otimizador perde a sua autonomia em favor
 da sua lógica de programação. Claro que se sua função é do tipo
 IMMUTABLE, isso não é tão importante, afinal, você não está
 consultando nenhuma tabela. Mas a sua função vai invariavelmente
 aparecer dentro de um SQL e aí as coisas vão se complicando.
 --
 Atenciosamente,
 Fábio Telles Rodriguez
 blog: http://savepoint.blog.br
 e-mail / gtalk / MSN: fabio.tel...@gmail.com
 Skype: fabio_telles

 Timbira - A empresa brasileira de Postgres
 http://www.timbira.com.br
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 Marcelo Silva
 
 Desenvolvedor Delphi / PHP
 My Postgres database
 Cel.: (11) 99693-4251

 ___
 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




-- 
Marcelo Silva

Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Marcelo da Silva
Valeu Fabio... estou aprimorando no postgres e vocês estão de parabéns


Em 6 de agosto de 2013 10:43, Marcelo da Silva marc...@ig.com.br escreveu:

 Hum... show, ali está bem explicado...

 Vou analisar minhas funções...

 Só um comentário achei estranho, no inicio ele diz que:
 O lado negativo de se empregar funções no Postgres ou em qualquer SGBD é
 a necessidade de um tempo significativo de processamento
 Eu sempre vi as funções dentro do banco como uma virtude justamente pelo
 ganho de processamento.

 Será que estou errado denovo?




 Em 6 de agosto de 2013 10:34, Claudio Bezerra Leopoldino 
 claudiob...@yahoo.com.br escreveu:

 *Assunto:* Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

 Fabio, desculpa aproveitar da sua bondade, mas como cuido de muita coisa
 aqui, fica meio dificil assimilar algumas coisas no postgres, sei que para
 isso seria bom fazer um cursinho, mesmo que rápido em DBA Postgres, mas
 sabcome né, então eu lhe pergunto quais as diferenças entre IMMUTABLE,
 VOLATILE, e STABLE ?
 Li no manual, mas confeço que fiquei meio confuso, pois ele se refere a
 dados vindos de tabelas ou não, e ao mesmo tempo cita que os dados podem
 ser mudados ou não, não compreendi, pois na minha concepção a volatilidade
 dos dados dependeriam dos dados de entrada também, então o que torna uma
 função volatil ou não ? Pelo meu ver toda função seria volatil, a menos que
 se guardasse o resultado em alguma variavel ou tabela, sei lá...

 Veja os exemplos deste post:


 http://postgresqlbr.blogspot.com.br/2012/08/categorias-de-volatilidade-de-funcoes.html

 Cordialmente,

 Cláudio


 Em 6 de agosto de 2013 09:36, Fábio Telles Rodriguez 
 fabio.tel...@gmail.com escreveu:

 Em 6 de agosto de 2013 08:56, Marcelo da Silva marc...@ig.com.br
 escreveu:
  Outro detalhe, relendo seu Post, você está dizendo que é melhor
 utilizar a
  verificação em cada select do que ter uma função pra isso? Não entendi.

 A regra de ouro é: se dá para fazer com SQL puro, não faça com PL.
 Quando você manda um comando para um SGDB, seja Postgres, SQL Server,
 Oracle, DB2 ou até o Mysql... eles tentam executar o seu comando da
 forma mais eficiente possível. Se você manda uma consulta envolvendo
 varias tabelas, ele vai avaliar em que ordem ele vai pegar as tabelas
 para executar a sua consulta.

 Quando você utiliza o PL, o otimizador perde a sua autonomia em favor
 da sua lógica de programação. Claro que se sua função é do tipo
 IMMUTABLE, isso não é tão importante, afinal, você não está
 consultando nenhuma tabela. Mas a sua função vai invariavelmente
 aparecer dentro de um SQL e aí as coisas vão se complicando.
 --
 Atenciosamente,
 Fábio Telles Rodriguez
 blog: http://savepoint.blog.br
 e-mail / gtalk / MSN: fabio.tel...@gmail.com
 Skype: fabio_telles

 Timbira - A empresa brasileira de Postgres
 http://www.timbira.com.br
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




 --
 Marcelo Silva
 
 Desenvolvedor Delphi / PHP
 My Postgres database
 Cel.: (11) 99693-4251

 ___
 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




 --
 Marcelo Silva
 
 Desenvolvedor Delphi / PHP
 My Postgres database
 Cel.: (11) 99693-4251




-- 
Marcelo Silva

Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Fwd: Funcão para contar dias uteis

2013-08-06 Por tôpico Fábio Telles Rodriguez
Em 6 de agosto de 2013 10:43, Marcelo da Silva marc...@ig.com.br escreveu:
 Hum... show, ali está bem explicado...

 Vou analisar minhas funções...

 Só um comentário achei estranho, no inicio ele diz que:
 O lado negativo de se empregar funções no Postgres ou em qualquer SGBD é a
 necessidade de um tempo significativo de processamento
 Eu sempre vi as funções dentro do banco como uma virtude justamente pelo
 ganho de processamento.

 Será que estou errado denovo?


Longa história. DEPENDE!!!

Em geral, rotinas em lote rodam mais rápido em funções dentro do
banco. Mas tem um problema... é mais fácil escalar processamento na
aplicação do que no banco. Ex: Você pode ter dezenas de servidores web
distribuindo a carga. Mas no banco de dados isso é uma história bem
mais complicada.

Tem gente que faz TUDO dentro do banco de dados. Tem de dosar um pouco
as coisas. Tenho clientes que abusaram das funções e ao invés de ter
gargalo de I/O como é comum em banco de dados, eles tem gargalo de
CPU.
-- 
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
e-mail / gtalk / MSN: fabio.tel...@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral