Re: [pgbr-geral] Nova camiseta "PostgreSQL Rock solid database"

2016-07-05 Por tôpico Daniel Cordeiro

Bom dia,

Em 04-07-2016 22:28, Fábio Telles Rodriguez escreveu:
Senhores, está à venda a nova camiseta que mandei fazer para a 
comunidade em comemoração aos 20 anos do PostgreSQL.


Tem uma estampa na frente e outra atrás:

http://www.lojadecamisetas.com/#!product-page/c1rx9/3fb64675-913e-543d-769a-49590130457e 
<http://www.lojadecamisetas.com/#%21product-page/c1rx9/3fb64675-913e-543d-769a-49590130457e>


Tem as versões branca e preta por R$ 55. Para São Paulo o frete é de 
graça.


O Frete também ficou grátis para Paraíba! 0/



Não estou levando nada na camiseta, se alguém quiser a arte eu posso 
mandar.


Estou comprando as duas primeiras peguem a de vocês também!



Parabéns pela iniciativa!
Att,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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

[pgbr-geral] Crosstab com nome de colunas dinâmicas

2016-04-17 Por tôpico Daniel Cordeiro
  5 |  3
 LIMPEZA - FAZENDA | (null) | (null) | (null) | (null)
   | (null) |  1 | (null) | (null) |  2 |  3 |  4 |  3
 MANUTENCAO - FAZENDA  | (null) | (null) | (null) | (null)
   |  3 | (null) | (null) |  1 | 42 |104 |180 | 42
 MATERIAIS DE EMBALAGEM| (null) | (null) | (null) | (null)
   | (null) | (null) | (null) | (null) | (null) |  1 |  1 |  1
 MATERIAIS DE EMBALAGENS   | 41 | 19 | 32 | 34
   | 52 | 78 | 73 | 48 | 46 | 59 | 58 | 28
 MATERIAIS DE EXPEDIENTE   |  9 |  6 |  5 |  8
   |  8 | 12 | 14 |  8 |  7 | 24 | 30 |  9
 MATERIAIS DE LABORATORIO  |  4 |  4 |  1 |  2
   |  4 |  6 |  4 | 10 |  5 |  2 |  5 |  8
 MATERIAIS DE LIMP.E CONSERV.  | 13 | 10 | 11 | 15
   | 19 | 18 | 19 | 18 | 17 | 35 | 36 | 10


Mas o crosstab não permite criar o nome destas colunas dinamicamente (a 
consulta só retorna os últimos 12 meses). Assim, tenho que encapsular a 
consulta em uma função e chamá-la em outras, uma para cada mês (e com 
isso formatando o nome das colunas de maneira correta).


Existe alguma forma de fazer isto sem utilizar este artifício?

Agradeço a ajuda,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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

Re: [pgbr-geral] Case com Zebedee

2014-07-25 Por tôpico Daniel Cordeiro

Boa tarde Jean,

Em 25-07-2014 08:32, Jean - GeControl escreveu:


 Utilizo Zebedee a um bom tempo.. é muito bom! Ele cria um tunel entre
 o server e o client e toda informação que trafega neste tunel é
 compactada, deixando assim a comunicação entre cliente/servidor mais
 rápida.

Uma pergunta de leigo: qual a diferença, em termos de performance, entre
uma ferramenta deste segmento e um túnel VPN sobre UDP compactado, como
por exemplo, o OpenVPN?

Tá aí, realmente não sei. Quem usa podia por aqui o case, sobre a 
diferença de performance, assim como Postgresql com SSL. O zebedee é 
muito leve, e no meu caso, não usei criptografia. Mas acredito que 
outras soluções do gênero ofereçam o mesmo benefício.


Aproveitei alguns minutos do almoço e fiz uma avaliação rápida cruzando 
acesso direto e VPN com e sem SSL. Utilizei o seguinte cenário:


 * Consulta que me retorna 1.642 registros com aprox. 2MB de tráfego de
   texto plano;
 * O servidor encontra-se a 30 saltos (via traceroute) de onde estou no
   momento. Executei os comandos em uma maquina linux com conexão ADSL GVT;
 * Como estamos em um horário de produção e a ADSL nesses horário pode
   ser afetada, a repetição do comando gerou alguns dados com
   distorções significativas. então capturei o valor mais próximo entre
   eles de um total de 10 execuções com intervalo de 2 segundos entre
   as execuções;
 * A consulta executada em localhost no servidor do banco tem um tempo
   de 10.998 ms;
 * Para não considerar o tempo de autenticação e validação da senha,
   seja manual, por software ou via .pgpass, alterei os acessos do
   usuário para TRUST para os IPs utilizados (público de minha estação
   e da VPN).

##Execução com IP público

#PSQL COM SSL habilitado
$ export SSLMODE=required
$ time psql portal -U daniel -h IP -c select * from tb_pedidos where 
fk_cliente = id  /dev/null


real0m1.823s
user0m0.089s
sys  0m0.009s

#PSQL SEM SSL habilitado
$ export SSLMODE=disable
$ time psql portal -U daniel -h IP -c select * from tb_pedidos where 
fk_cliente = id  /dev/null


real0m2.072s
user0m0.090s
sys  0m0.012s

##Execução em VPN com comp-lzo habilitado

#PSQL COM SSL habilitado
$ export SSLMODE=required
$ time psql portal -U daniel -h 10.1.0.10 -c select * from tb_pedidos 
where fk_cliente = id  /dev/null


real0m1.861s
user0m0.090s
sys0m0.010s

##PSQL SEM SSL habilitado

$ export SSLMODE=disable
$ time psql portal -U daniel -h 10.1.0.10 -c select * from tb_pedidos 
where fk_cliente = id  /dev/null


real0m1.785s
user0m0.086s
sys  0m0.013s


Uma vez que o OpenVPN já é criptografado e esta com compactação 
habilitada, a melhor situação foi VPN com conexão ao banco SEM SSL. 
Apesar da diferença ser muito baixa.


Espero que ajude.

Att,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


Re: [pgbr-geral] Case com Zebedee

2014-07-24 Por tôpico Daniel Cordeiro


Em 24-07-2014 19:02, Renato Ricci escreveu:
Utilizo Zebedee a um bom tempo.. é muito bom! Ele cria um tunel entre 
o server e o client e toda informação que trafega neste tunel é 
compactada, deixando assim a comunicação entre cliente/servidor mais 
rápida.


Uma pergunta de leigo: qual a diferença, em termos de performance, entre 
uma ferramenta deste segmento e um túnel VPN sobre UDP compactado, como 
por exemplo, o OpenVPN?


Att,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


Re: [pgbr-geral] VIEWS com parâmetro

2014-02-06 Por tôpico Daniel Cordeiro
Em 05/02/2014 22:29, Fabrízio de Royes Mello fabri...@timbira.com.br
escreveu:

 On 05-02-2014 15:01, Daniel Cordeiro wrote:


 Obrigado pela correção Euler. Na ânsia de explicar uma forma de executar
 o que se tinha interesse escrevi sem nem pensar na reescrita feita pelo
 planejador antes da execução. Serei mais cuidadoso nas próximas!

 Acontece que minha realidade para a consulta que impulsionou a escolha
 por uma procedure ao invés de uma visão é bem diferente da exposta no
 início deste tópico. Minha consulta possui diversas subqueryes com
 definições de parâmetros  e cálculos  que não puderam ser
 solucionados/otimizados com uso de CTEs ou views (e se tornou
 impraticável para o momento a reescrita do modelo de negócio do banco).
 E não apenas encapsular uma única condição.

 Claro, sempre existe uma forma melhor de se fazer, o limite neste
 contexto esta no meu 'universo conhecido' ;-P.


 Daniel,

 Creio que vc compreendeu bem porque o pessoal lhe indicou simplesmente
criar uma VIEW e que a mesma sofre um processo de reescrita antes de ser
executada, e com isso obtemos performance.

Entendi sim.


 Então se mesmo assim vc precisa de um parametro em sua view, creio que
podes usar as funções set_config e current_setting [1] para criar uma
variável de sessão (ou use a extensão session_variables [2]).

 Exemplo:

 CREATE VIEW v_foo AS SELECT * FROM foo WHERE codigo =
current_setting('foo.codigo')::INTEGER;

 Para executar:

 SELECT set_config('foo.codigo', '1', false);
 SELECT * FROM v_foo;

 Não sei se isso lhe ajudará, até porque não compreendi bem o seu problema
de usar uma VIEW sem isso, e também tem a questão que vc terá se setar na
sessão o valor do seu parâmetro...

O problema na verdade não é meu, eu apenas tentei ajudar apresentando um
case onde utilizo funções no lugar de visões (no meu caso,  utilizo a plsql
para testes e exceções).

Contudo,  sua dica de sessão será muito útil para um outro case de
auditoria onde utilizo tabelas temporárias para armazenar um simples
valor.  Obrigado pela dica!
 Att,

 [1] http://www.postgresql.org/docs/current/static/functions-admin.html
 [2] http://pgxn.org/dist/session_variables/0.0.4/

 --
Fabrízio de Royes Mello Timbira - http://www.timbira.com.br/

PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
 ___
 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] VIEWS com parâmetro

2014-02-06 Por tôpico Daniel Cordeiro

Em 05-02-2014 19:46, Matheus de Oliveira escreveu:

...

Sim, isso realmente poderia acontecer. Creio que o seu caso foi numa 
versão anterior à 9.2, correto?


Na 9.2 o modelo de gerar plano de execução para prepared statements 
mudou, e ficou bem melhor. Agora o plano é gerado no EXECUTE, quando 
já são conhecidos os valores. Recomendo você a testar novamente essas 
funções numa versão mais recente (9.2 ou 9.3) e verificar se o 
comportamento ainda é o mesmo. Se o fizer, por favor compartilhe os 
resultados com os colegas, ;-)...
Bingo!! Na época do caso, utilizávamos a versão 9.1. Migramos os 
sistemas para a versão 9.3 neste final de semana. Mas a frente 
realizarei alguns testes com as procedures antigas e posto os resultados 
aqui.





Lembrando que estas ações podem dificultar a análise de um
problema futuro, pois o EXPLAIN não vai detalhar o conteúdo
interno executado na função e nem nos logs.


+1. Otimizar funções é uma tarefa bem árdua. Só uma dica, a
extensão auto_explain pode ajudar nessa tarefa. ;-)


Obrigado pela dica! Vou estudar a extensão para verificar sua
adoção em nosso ambiente.


É, na minha opinião, um pré-requisito para quem usa muitas funções.

Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres http://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


Atenciosamente,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


Re: [pgbr-geral] VIEWS com parâmetro

2014-02-05 Por tôpico Daniel Cordeiro


Em 05-02-2014 12:10, Euler Taveira escreveu:

On 05-02-2014 11:41, Daniel Cordeiro wrote:

Acredito que esta não seja uma opção tão 'performática', uma vez que a
view vai gerar todos os dados e só depois é que o planejador realizará a
restrição através do cláusula WHERE e ordenações necessárias.


Você está equivocado. Nenhum dado é gerado por ser uma visão. Há uma
etapa antes do planejamento que se chama reescrita. Nesta etapa, as
visões são mescladas com a consulta informada e somente depois a árvore
de consulta é passada para o planejador escolher o plano.
Obrigado pela correção Euler. Na ânsia de explicar uma forma de executar 
o que se tinha interesse escrevi sem nem pensar na reescrita feita pelo 
planejador antes da execução. Serei mais cuidadoso nas próximas!


Acontece que minha realidade para a consulta que impulsionou a escolha 
por uma procedure ao invés de uma visão é bem diferente da exposta no 
início deste tópico. Minha consulta possui diversas subqueryes com 
definições de parâmetros  e cálculos  que não puderam ser 
solucionados/otimizados com uso de CTEs ou views (e se tornou 
impraticável para o momento a reescrita do modelo de negócio do banco). 
E não apenas encapsular uma única condição.


Claro, sempre existe uma forma melhor de se fazer, o limite neste 
contexto esta no meu 'universo conhecido' ;-P.

O tempo de reescrita não é algo crítico (pelo menos nunca vi relatos).
Além disso, é ingenuidade pensar que a execução de funções não tem custo
inicial. Eu só usaria funções se precisasse de algo procedural (se bem
que dá para fazer várias coisas procedurais com SQL :-).




--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


Re: [pgbr-geral] VIEWS com parâmetro

2014-02-05 Por tôpico Daniel Cordeiro


Em 05-02-2014 11:55, Matheus de Oliveira escreveu:
...
', uma vez que a view vai gerar todos os dados e só depois é que o 
planejador realizará a restrição através do cláusula WHERE e 
ordenações necessárias.




humm... Sua afirmação não está correta. Dada a view teste a seguinte 
consulta:


SELECT * FROM teste WHERE nome = 'matheus';

Passa por algumas transformações, primeiro:

SELECT * FROM (SELECT id_nome, nome FROM nomes) teste WHERE nome = 
'matheus';

EXECUTE nunca é minha primeira opção
Em seguida, o PostgreSQL percebe que não precisa da subquery e 
transforma a query acima em:


SELECT id_nome, nome FROM nomes AS teste WHERE teste.nome = 'matheus';

Resumindo, a view não vai gerar todos os dados, a consulta (acima) é 
que será executada no final (claro ainda tem o plano de execução, 
métodos de acesso, etc.).


Eu até diria que nesse exemplo específico a view me parece até mais 
adequada e mais fácil de manter do que a função.



Como eu falei no email que respondi para Euler: My bad :-(


Minha sugestão é criar uma função que realiza a consulta já
adicionando as restrições necessárias para a triagem inicial dos
dados desejados.

Ex (descartando índices, segurança da função, etc)*1*.

/CREATE TABLE lancamentos (id int, conta text, campo1 text,
campo2 text);//
//
//INSERT INTO lancamentos
VALUES(1,'Produtivo','valor1','valor2');//
//INSERT INTO lancamentos
VALUES(2,'Produtivo','valor1','valor2');//
//INSERT INTO lancamentos
VALUES(3,'Mecanica','valor1','valor2');//
//INSERT INTO lancamentos
VALUES(4,'Mecanica','valor1','valor2');//

//
//CREATE OR REPLACE FUNCTION sp_lancamentos(IN CODCONTA
varchar) RETURNS TABLE(i int, c1 text,c2 text, c text)//
//AS $$//
//
//BEGIN//
//RETURN QUERY SELECT id,conta,campo1,campo2 FROM
lancamentos WHERE conta = CODCONTA;//
//END;//
//$$//
//language 'plpgsql';/



OK. Realmente, para aceitar parâmetros da forma que o OP espera, é 
necessário sim uma função.


Eu só recomendaria, nesse caso especificamente, a usar uma função SQL 
ao invés de PL/pgSQL:


CREATE OR REPLACE FUNCTION sp_lancamentos(IN CODCONTA varchar)
RETURNS TABLE(i int, c1 text,c2 text, c text)
AS $$
SELECT id,conta,campo1,campo2 FROM lancamentos WHERE conta = 
CODCONTA;

$$
LANGUAGE SQL;

Para chamá-la:

SELECT * FROM sp_lancamentos('Produtivo');

(a chamada em si seria igual à PL/pgSQL, só quis exemplificar)]
Claro, usei o plpgsql por me basear em algo que já tinha, e o mesmo 
depende dos recursos além da sql.


Para uma function muito grande e com muitas variáveis para
substituição, vale a pena utilizar a cláusula EXECUTE no RETURN
QUERY (isso já me salvou de vários problemas em functions com mais
mais de 1500 linhas e código e dezenas de variáveis)*2*:
/

RETURN QUERY EXECUTE 'SELECT id,conta,campo1,campo2 FROM
lancamentos WHERE conta = $1' USING CODCONTA;//
/



Ah? Por quê? Eu particularmente tento evitar o EXECUTE ao menos que 
estritamente necessário. Lembre-se que ele não pode ser otimizado pelo 
PL/pgSQL para armazenar o plano de execução.


Eu também não. Mas neste meu caso, após o crescimento de dados em alguns 
clientes (alguns milhões de registros em dezenas de tabelas), o 
QueryPlan dentro da procedure passou a ser tratado de maneira totalmente 
diferente  se comparado à execução da mesma query já com os valores 
prefixados nas condicionais e subqueryes fora da procedure. 
Aparentemente, como o prepare acontece antes do conhecimento dos 
parâmetros na procedure, o planejador gerava um plano de execução mais 
custoso. (novamente, esta foi a minha impressão sobre o caso).


Estou falando da mesma consulta rodando em 5 horas dentro da procedure e 
7 segundos rodando fora. Inicialmente pensei que fosse a adoção do 
RETURN QUERY. Ao modificar a procedure fazendo o retorno com o EXECUTE, 
o tempo foi normalizado e o custo de operação dentro e fora da procedure 
ficou, de fato, irrelevante.





Lembrando que estas ações podem dificultar a análise de um
problema futuro, pois o EXPLAIN não vai detalhar o conteúdo
interno executado na função e nem nos logs.


+1. Otimizar funções é uma tarefa bem árdua. Só uma dica, a extensão 
auto_explain pode ajudar nessa tarefa. ;-)


Obrigado pela dica! Vou estudar a extensão para verificar sua adoção em 
nosso ambiente.


Atenciosamente

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn

Re: [pgbr-geral] VIEWS com parâmetro

2014-02-04 Por tôpico Daniel Cordeiro


Em 04-02-2014 15:16, Matheus Saraiva escreveu:
Como faço para criar uma view que receba um parâmetro que será usado 
na clausula


WHERE ?



Uma forma é encapsular sua consulta em uma function recebendo parâmetros 
e usando como returns TABLE.


--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


[pgbr-geral] Retorno de valor padrão em SELECT

2014-01-31 Por tôpico Daniel Cordeiro

Boa tarde a todos,

Possuo um sistema web onde o controle de usuários acontece através de 
tabelas de usuários e controle de permissões na aplicação. Para realizar 
o registro de mudanças nas tabelas por gatilhos, crio uma tabela 
temporária com o id do usuário e na hora de registrar as mudanças via 
trigger capturo desta tabela temporária o id do usuário armazenando os 
dados alterados com o usuário que realizou a operação na aplicação.


Acontece que, algumas operações de backend rodam abaixo da aplicação, 
através de triggers e/ou chamadas internas via webservice. Para estas 
operações, a tabela temporária não vai existir e não posso inserir 
nenhum valor de uusário nela, mas nestes casos eu consigo realizar o 
controle através de usuários do próprio banco (cada aplicação de backend 
roda com um usuário específico do postgres).


Na minha função, inicio a chamada para recolher o valor do usuário da 
seguinte forma:


...
-- Cria o diretório temporário para ocaso da execução ser feita através 
das chamadas de backend
CREATE TEMP TABLE IF NOT EXISTS tmp_usuario_logado (id_usuario_cliente 
VARCHAR(30));


-- Recupera o id do usuário, caso não exista (tabela recem criada), 
recupera o current_user do banco

SELECT id_usuario_cliente
INTO USUARIO_CLIENTE
   FROM (SELECT id_usuario_cliente::text AS id_usuario_cliente,
   0 AS prioridade
 FROM tmp_usuario_logado
   UNION
   SELECT current_user AS id_usuario_cliente,
1 AS prioridade
   ORDER BY prioridade ASC
  LIMIT 1) AS dados_usuario;
...

A operação em sim funciona e atende minha necessidade de auditoria (por 
usuário do banco ou por id do usuário do cliente). Sendo que, como 
realizamos muitas transações de insert, update,delete em lote, o tempo 
de criação desta tabela e o select no mesmo acaba ganhando proporções 
que podem impactar no desempenho do sistema no futuro.


* Existe alguma forma de se criar uma variável dinâmica no Postgres 
setada na aplicação (por exemplo via SET) para que eu elimine a criação 
e consulta nesta tabela temporária?
* No caso de não existir na atual versão do postgres (acabo de migrar 
para a 9.3.2), existe alguma forma de reduzir a operação deste select 
que estou usando?


O Explain das operações (acontecem em cada operação de INSERT, DELETE, 
UPDATE *por linha*).


CREATE TEMP TABLE IF NOT EXISTS tmp_usuario_logado (id_usuario_cliente 
VARCHAR(30));

CREATE TABLE
Time: 6,246 ms

---

EXPLAIN ANALYZE SELECT id_usuario_cliente
INTO USUARIO_CLIENTE
   FROM (SELECT id_usuario_cliente::text AS id_usuario_cliente,
   0 AS prioridade
 FROM tmp_usuario_logado
   UNION
   SELECT current_user AS id_usuario_cliente,
1 AS prioridade
   ORDER BY prioridade ASC
  LIMIT 1) AS dados_usuario;
QUERY PLAN
--
 Subquery Scan on foo  (cost=118.04..118.06 rows=1 width=32) (actual 
time=0.028..0.029 rows=1 loops=1)
   -  Limit  (cost=118.04..118.05 rows=1 width=4) (actual 
time=0.028..0.028 rows=1 loops=1)
 -  Sort  (cost=118.04..124.05 rows=2401 width=4) (actual 
time=0.027..0.027 rows=1 loops=1)

   Sort Key: (0)
   Sort Method: quicksort  Memory: 25kB
   -  HashAggregate  (cost=82.03..106.04 rows=2401 
width=4) (actual time=0.017..0.020 rows=2 loops=1)
 -  Append  (cost=0.00..70.02 rows=2401 width=4) 
(actual time=0.006..0.011 rows=2 loops=1)
   -  Seq Scan on tmp_usuario_logado 
(cost=0.00..46.00 rows=2400 width=4) (actual time=0.006..0.007 rows=1 
loops=1)
   -  Subquery Scan on *SELECT* 2 
(cost=0.00..0.02 rows=1 width=0) (actual time=0.003..0.003 rows=1 loops=1)
 -  Result  (cost=0.00..0.01 rows=1 
width=0) (actual time=0.002..0.002 rows=1 loops=1)

 Total runtime: 0.067 ms

Atenciosamente,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


Re: [pgbr-geral] pgModeler

2013-04-02 Por tôpico Daniel Cordeiro


Em 2 de abril de 2013 08:26, Alex Wedsday alexweds...@hotmail.com 
mailto:alexweds...@hotmail.com escreveu:


Bom dia, Pessoal!

pgModeler não sabia que existia, muito bom gostei  e vou
economizar horas de trabalho.

Obrigado gersoncjunior.




No nosso caso aqui  na empresa, tivemos problemas em utilizar a versão 
pré compilada para 32 bits em estações com Debian Wheezy. O problema 
principal estava no travamento da aplicação no momento que se criava 
relacionamentos.


Resolvi o problema baixando os fontes e compilando novamente para a 
nossa versão.


Se alguém estiver passando por problemas semelhantes no Debian Wheezy, 
basta solicitar em PVT quer mando o build para testarem.


No mais, esta aplicação promete!!!

[]'s

+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


Re: [pgbr-geral] modelo físico

2012-09-04 Por tôpico Daniel Cordeiro
Não sei se era este o link que o Dutra queria informar, mas foi o que 
achei indexado pelo google:

https://docs.google.com/viewer?url=http%3A%2F%2Fdutra.fastmail.fm%2FPostgreSQL%2FFISL%2Filus.art.pdf

Saudações,

+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

Em 04-09-2012 16:47, Guimarães Faria Corcete DUTRA, Leandro escreveu:
 2012/9/4 Pedro Costa pedrocostaa...@sapo.pt:
 Estou a fazer um trabalho da universidade na qual desenvolvi uma base de
 dados em postgresql/postgis.
 Apresentei no manual o modelo conceptual que desenhei com o dia (na
 altura alguém aqui na lista deu-me essa dica). Agora estou a 'tratar de
 explicar o modelo físico'. A minha questão é se alguém tem ideia sobre a
 melhor maneira de o apresentar?
 Uma abordagem é usar o AutoDoc.  Eu costumava usá-lo com um documento
 de programação literária LaΤεχ com SQL embutido; o LaΤεχ virava um PDF
 que incorporava os diagramas gerados pelo AutoDoc (ou pelo SQL::Fairy)
 do SQL que o noweb separava do LaΤεχ.  Veja minha palestra _O Elefante
 ilustrado_ para detalhes e exemplos.
 ___
 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] Modo mais elegante para Like

2011-07-21 Por tôpico Daniel Cordeiro

Em 21-07-2011 16:35, Marcelo Silva (IG) escreveu:

Pessoal, tenho o seguinte select
SELECT * FROM TABELA
WHERE (CAMPO1 LIKE 'STRING_A%')
OR(CAMPO1 LIKE 'STRING_B%')
OR(CAMPO1 LIKE 'STRING_C%')
Observe que tenho que fazer varios ORs com Like porque as strings são 
o inicio de palavras




SELECT * FROM TABELA WHERE CAMPO ~ E'^(STRING_A|STRING_B|STRING_C)';

Existe várias formas de se fazer com ER.

+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+


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


Re: [pgbr-geral] PARA AUDITORIA

2011-07-12 Por tôpico Daniel Cordeiro
Olá Dickson,

Eu possuo uma aplicação que roda um esquema de auditoria conforme vocês 
estão falando, sendo que, por ser uma aplicação WEB, não tenho como 
auditar o processo por usuário do banco. Os usuários se encontram em uma 
tabela de minha aplicação. Não é uma aplicação tão grande, com picos de 
150 usuários simultâneos  e média de 80 rodando 24x7.

Para resolver esta situação, No momento em que o usuário se autentica, 
crio uma tabela temporária para a sessão com o id do usuário e os dados 
que necessito dele. Com isso, posso recuperar os dados do usuário pelas 
triggers de auditoria e registrar tudo que o usuário faz em um Schema 
independente do usuário do banco de dados. Sem precisar controlar a 
auditoria pela aplicação.

Claro que, para melhorar a performance (não solicitar que a aplicação 
crie a cada execução a tabela temporária), utilizo conexões persistentes.

Espero ter ajudado.

+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+



Em 11-07-2011 19:36, Dickson S. Guedes escreveu:
 Em 11 de julho de 2011 17:34, Flavio Henrique Araque Gurgel
 fha...@gmail.com  escreveu:
 [...]
 - triggers nas tabelas que precisam de auditoria, essas triggers podem
 gravar alterações numa tabela de auditoria, lembrando que existe uma
 penalidade de performance aí. Já implementei auditoria assim.
 É a linha seguida pelo tablelog e pelo emaj, só que minha intenção era
 que o colega Eduardo descobrisse isso pesquisando as ferramentas que
 citei, mas agora você já revelou a surpresa... :(

 Aproveitando o tema, esse tipo de auditoria é interessante quando cada
 usuário da aplicação possui um usuário no banco. Já em aplicações que
 possuem um servidor de aplicação entre o cliente e o banco é comum
 existir um pool de conexões que utilizam um mesmo usuário para se
 conectar ao banco. Neste tipo de cenário é recomendado que a aplicação
 tome conta da auditoria. Distribuir a auditoria tanto na aplicação
 quando no banco de dados também é uma alternativa.

 Já utilizei as 3 (três) alternativas, e cada uma tem seus prós e contras.

 []s
 Dickson S. Guedes
 mail/xmpp: gue...@guedesoft.net - skype: guediz
 http://guedesoft.net - http://www.postgresql.org.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] PARA AUDITORIA

2011-07-12 Por tôpico Daniel Cordeiro


Em 12-07-2011 14:28, Dickson S. Guedes escreveu:

Ola Daniel! [...]

Para resolver esta situação, No momento em que o usuário se autentica, crio
uma tabela temporária para a sessão com o id do usuário e os dados que
necessito dele. Com isso, posso recuperar os dados do usuário pelas triggers
de auditoria e registrar tudo que o usuário faz em um Schema independente do
usuário do banco de dados. Sem precisar controlar a auditoria pela
aplicação.

Fiquei curioso, como o banco sabe que aquela inserção ou alteração foi
feita pelo usuário 'A' e não pelo usuário 'B'? Ou você não mantém um
pool?
Na autenticação do usuário pela aplicação (autenticando em uma tabela de 
contas de usuários), eu crio uma tabela temporária contendo todos os 
dados necessários pelos meus gatilhos de auditoria. No momento que 
acontece alguma modificação no sistema (normalmente autentico apenas 
INSERT, UPDATE e DELETE),o gatilho recolhe os dados do usuário corrente 
nesta tabela temporária (que é vista apenas pelo usuário da sessão). 
Desta forma, mantenho os logs sempre pelo ID do usuário no sistema.


Um exemplo do código (escrito em PHP):

1- Parte: Criação da tabela

// {{{ Criando Tabela Temporária para armazenamento do 
id_usuario_cliente corrente

$stmt = $conexao-query(SELECT table_schema,
   table_name,
table_type
 FROM 
information_schema.tables
  WHERE table_name = 
'tmp_usuario_logado'

 );

if ($stmt-fetchColumn(0)) {

  // A tabela ainda não existe, então crio a tabela com os dados da 
aplicação após terem sido autenticados no banco
  $conexao-query(CREATE TEMP TABLE tmp_usuario_logado (id_usuario 
VARCHAR(10)));

   
  // Inserindo o id do usuario
  $conexao-query(INSERT INTO tmp_usuario_logado VALUES 
{$_SESSION['id_usuario']}());

  ...
}

2 - Gatilho recolhendo id no ato da atualização (feito em pl/perlu).

(Este modelo de auditoria eu acabei adaptando de um código 
disponibilizado na internet a muitos anos atrás, como modifiquei muito e 
já passaram por outros desenvolvedores, a fonte acabou se perdendo, mas 
fica aqui o aviso dos créditos).



Código fonte|
   |   #-- Pegando o ID do usuario (o mesmo 
sera pego de uma tabela temporaria)
   |   my $sql = SELECT id_usuario AS id FROM 
tmp_usuario_logado;

   |   my $temp_id = spi_exec_query($sql);
   |
   |   #-- Tipo de Evento (INSERT / UPDATE / 
DELETE)

   |   my $evento = $_TD-{event};
   |
   |   #-- OID da tabela que recebeu o comando
   |   my $oid_tabela = $_TD-{relid};
   |
   |   #-- Nome da tabela que recebeu o comando
   |   my $tabela = $_TD-{relname};
   |
   |   #-- Query para pegar o nome do esquema
   |   my $sql = SELECT schemaname AS esq
   |FROM pg_catalog.pg_tables
   |  WHERE tablename = '$tabela';
   |   my $esquema  = spi_exec_query($sql);
   |   $nome_esquema = $esquema-{rows}[0]-{esq};
   |
   |   #-- Chave Primária da Tabela
   |   $pk_tabela = spi_exec_query(SELECT * 
FROM public.pegaChavePk($oid_tabela) AS pk);

   |
   |   my $chaves_primarias = 
$pk_tabela-{processed};

   |   my $pk_coluna = ;
   |   my $pk_valor   = ;
...
E por ai vai o código para recolher a os dados
...

*ATENÇÃO*

Existem um inconveniente (para alguns) deste modelo: quando necessito 
realizar qualquer alteração direto no banco de dados, eu preciso 
executar antes de qualquer coisa uma procedure que cria a estrutura de 
tabela temporária (neste caso, com um usuário administrativo), caso 
contrario, ele impede a operação (pode ser interessante por questões de 
segurança).



Em tempo grato pela contribuição.

[]s
Guedes



Espero ter ajudado em algo.

+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn

Re: [pgbr-geral] Uso do PREPARE dentro de uma RULE

2011-05-07 Por tôpico Daniel Cordeiro
/in/fabriziomello



Obrigado pelo retorno.

Atenciosamente,

+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+

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


[pgbr-geral] Uso do PREPARE dentro de uma RULE

2011-05-06 Por tôpico Daniel Cordeiro

boa tarde a todos,

Tenho uma aplicação que a cada conexão do sistema, ele cria uma tabela 
temporária onde persiste informações que normalmente são utilizadas em 
algumas procedures em pl/perl.


Acontece que estou querendo gerar uma rotina de histórico de 
procedimentos utilizando apenas rules, e um dos parâmetros essenciais e 
o id de quem realizou a operação (que consta nesta tabela temporária). 
Quando eu crio a rule e a tabela temporária já esta criada, a rule 
funciona sem problemas, só que quando eu reconecto ela não consegue 
encontrar a tabela temporária novamente (o schema pg_temp_*X* pode ter 
uma numeração diferente e parece que a rule não pesquisa no PATH do 
sistema). Precisando dar um replace na rule para ela funcionar.


Pensei em utilizar PREPARE e EXECUTE para me trazer os dados, sendo que 
PREPARE esta dando problemas dentro da rule. Segue a rule:

/
/

   /CREATE or REPLACE RULE  historico_cliente_associado AS ON  UPDATE
   TO  tb_clientes_associados /
   /DO INSTEAD(/

   / PREPARE id_usuario AS/
   / SELECT id_usuario_cliente /
   /   FROM tmp_usuario_logado;/
   //
   / INSERT INTO logs.tb_alteracoes_clientes_associados(nome_abreviado,/
   / porcentagem_plano,/
 ...
   / usuario_atualizou) /
   /  values(old.nome_abreviado,/
   /  old.porcentagem_plano,
  ...
   //   (EXECUTE id_usuario)/
   /  );/
   / );/


Ele gera o seguinte erro:

ERRO:  erro de sintaxe em ou próximo a PREPARE
LINHA 3:  PREPARE id_usuario AS


Alguém poderia ajudar?

Grato,

--
+--+
| Daniel Cordeiro de Morais Neto
| Diretor de TI - Portal de Cotações e-Compras
| Sócio-diretor ADM Soluções em Informática LTDA
| daniel.cordeiro(at)cotacoesecompras.com.br
| dmoraisn(at)gmail.com
| www.cotacoesecompras.com.br
| Fone: (083)8724-4440
| Gentoo User
| http://twitter.com/dmoraisn
+--+


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


Re: [pgbr-geral] Large Objects

2008-01-09 Por tôpico Daniel Cordeiro - ADMSI
Olá,

Luiz escreveu:
 Boa tarde  a todos,
  
 Costumo armazenar no meu banco de dados fotos e também relatórios 
 (arquivos .rpt). Os formatos utilizados são lo para os relatórios e bytea 
 para as fotos.
 Sei que o PostgreSQL armazena os arquivos grandes em 
 pg_catalog.pg_largeobject inclusive dividindo esses arquivos em diversos 
 pedaços menores mais convenientes para serem armazenados.
 Alguém pode me dizer se somente os large objects (lo) são armazenados no 
 pg_largeobject ou também algumas fotos grandes do tipo bytea podem ser 
 armazenadas no pg_largeobject?
  
   
Eu costumo utilizar pelo psql as funções \lo_list para visualizar os
arquivos armazenados no banco de dados, para remover esses arquivos, é
sempre bom utilizar o \lo_unlink OID para  remover o arquivo do banco de
dados. Lembrando para fazer a faxina no banco, é necessário
periodicamente um vacuum para remover de fato o arquivo.
  
 Outra coisa, depois que passei a armazenar os relatórios no banco de 
 dados, o tamanho do meu BD aumentou substancialmente chegando a mais de 10 
 vezes o seu tamanho original, sendo que armazeno uma média de 50 relatórios 
 com 15K cada um.
 Desconfio que cada vez que atualizo os relatórios eles estão sendo 
 duplicados no pg_largeobject e quando eu os deleto eles ainda continuam lá. 
 O que eu posso estar fazendo de errado?? Esse armazenamento no 
 pg_largeobject é feito totalmente por conta do PostgreSql certo?? então 
 quando eu for deletar um relatório preciso fazer alguma coisa além de delete 
 from tabela???
  Se eu der um delete from pg_catalog.pg_largeobject, além de sumir com 
 os meus relatórios, no que mais isso pode influenciar???
  
 Obrigado!!!
  
   
Espero ter ajudado
  
 Luiz Henrique Livrari
 Implantador de Sistemas Jr.
 MSI SOLUÇÕES
 Av. Dr. Altino Arantes, 131 Sala 145 - 146 Centro - Ourinhos/SP - Brasil
 Fone: +55 (14) 3324-8181 / (14) 3335-1849 www.msisolucoes.com.br
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

   


-- 
/* O único lugar aonde o sucesso vem antes do trabalho é no 
dicionário. (Albert Einstein) */

+--+
| Daniel Cordeiro de Morais Neto   |
| [EMAIL PROTECTED]|
| Administrador de Redes   |
| ADM Soluções em Informática LTDA |
| www.admsi.com.br |
| F. (083)244-0757 |
| Debian User - 453 - Sarge|
| Gentoo User  |
+--+ 



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