Discussion:
Funcão para contar dias uteis
Marcelo da Silva
2013-08-05 18:36:15 UTC
Permalink
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
Fábio Telles Rodriguez
2013-08-06 11:50:10 UTC
Permalink
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/
Post by Marcelo da Silva
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
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: ***@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
Marcelo da Silva
2013-08-06 11:54:31 UTC
Permalink
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...
Post by 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,
http://www.postgresql.org/docs/current/static/sql-createfunction.html
http://savepoint.blog.br/brincando-com-algumas-funcoes-com-data-no-postgresql/
Post by Marcelo da Silva
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
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Marcelo Silva
----------------------------------------------------------------
Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
Marcelo da Silva
2013-08-06 11:56:47 UTC
Permalink
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.
Post by 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 <
Marcelo, lamento lhe informar.... mas você está fazendo isso do jeito
Post by Fábio Telles Rodriguez
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,
http://www.postgresql.org/docs/current/static/sql-createfunction.html
http://savepoint.blog.br/brincando-com-algumas-funcoes-com-data-no-postgresql/
Post by Marcelo da Silva
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
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Atenciosamente,
Fábio Telles Rodriguez
blog: http://savepoint.blog.br
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
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
Fábio Telles Rodriguez
2013-08-06 12:36:44 UTC
Permalink
Post by 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.
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: ***@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
Marcelo da Silva
2013-08-06 13:22:11 UTC
Permalink
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á...
Post by Fábio Telles Rodriguez
Post by Marcelo da Silva
Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar
a
Post by Marcelo da Silva
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
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Marcelo Silva
----------------------------------------------------------------
Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
Marcelo da Silva
2013-08-06 13:25:27 UTC
Permalink
O mais importante deixei de lado:

Quando devo usar

VOLATILE
IMMUTABLE
STABLE

?
Post by Marcelo da Silva
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 <
Post by Marcelo da Silva
Post by Marcelo da Silva
Outro detalhe, relendo seu Post, você está dizendo que é melhor
utilizar a
Post by Marcelo da Silva
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
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
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
Claudio Bezerra Leopoldino
2013-08-06 13:34:09 UTC
Permalink
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
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
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Marcelo Silva
----------------------------------------------------------------
Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
Marcelo da Silva
2013-08-06 13:43:25 UTC
Permalink
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 <
*Assunto:* Re: [pgbr-geral] Fwd: Funcão para contar dias uteis
Post by Marcelo da Silva
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 ?
Post by Marcelo da Silva
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á...
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 <
Post by Marcelo da Silva
Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar
a
Post by Marcelo da Silva
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
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
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
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
--
Marcelo Silva
----------------------------------------------------------------
Desenvolvedor Delphi / PHP
My Postgres database
Cel.: (11) 99693-4251
Marcelo da Silva
2013-08-06 14:03:52 UTC
Permalink
Valeu Fabio... estou aprimorando no postgres e vocês estão de parabéns
Post by Marcelo da Silva
Hum... show, ali está bem explicado...
Vou analisar minhas funções...
"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 <
*Assunto:* Re: [pgbr-geral] Fwd: Funcão para contar dias uteis
Post by Marcelo da Silva
Post by Marcelo da Silva
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 ?
Post by Marcelo da Silva
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á...
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 <
Post by Marcelo da Silva
Outro detalhe, relendo seu Post, você está dizendo que é melhor
utilizar a
Post by Marcelo da Silva
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
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
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
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
_______________________________________________
pgbr-geral mailing list
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
Fábio Telles Rodriguez
2013-08-06 15:18:12 UTC
Permalink
Post by Marcelo da Silva
Hum... show, ali está bem explicado...
Vou analisar minhas funções...
"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: ***@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
Fábio Telles Rodriguez
2013-08-06 13:42:05 UTC
Permalink
Post by Marcelo da Silva
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: ***@gmail.com
Skype: fabio_telles

Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
Emerson Hermann
2013-08-06 13:28:55 UTC
Permalink
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';
Post by Fábio Telles Rodriguez
Post by Marcelo da Silva
Outro detalhe, relendo seu Post, você está dizendo que é melhor utilizar
a
Post by Marcelo da Silva
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
Skype: fabio_telles
Timbira - A empresa brasileira de Postgres
http://www.timbira.com.br
_______________________________________________
pgbr-geral mailing list
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Loading...