Re: [pgbr-geral] Dúvida em select

2016-05-05 Por tôpico Jean Alysson
Em 05/05/2016 11:09, "Tiago José Adami"  escreveu:
>
> Em 4 de maio de 2016 23:10, Jean Alysson  escreveu:
> > Ola Tiago, está correta sua dedução
> > obrigado pela resposta !
> >
> > Estou começando com PostgreSql, então gostaria de saber se dessa forma
eu
> > teria boa performance ?
> > Esta solução com subselect poderia ser feita sem usar 2 selects  ? over
> > partition, with query ou algo assim ?
> >
>
> Olá Jean.
>
> Evite o top posting, prefira sempre escrever abaixo das mensagens
> anteriores. Isto facilita a leitura.
>
> Não é exclusividade do PostgreSQL, o desempenho vai depender de vários
> fatores como: número de registros, índices criados e número de campos
> (atributos) envolvidos na cláusula WHERE.
>
> É possível reescrever esta consulta de várias maneiras. É possível
> também utilizando window functions, mas acredito que o esforço será
> maior, o código SQL será maior e o desempenho será pior, haja vista
> que mais registros serão lidos do banco de dados e trazidos para a
> memória para realização de operações de ordenação, causando uso
> adicional de CPU.
>
> O que vai impactar mais no desempenho da consulta como descrevi são os
> índices sobre a tabela. Por exemplo: você pode criar índices compostos
> colocando os campos utilizados na consulta com maior incidência de
> valores distintos à frente dos campos que possuem menor distinção de
> valores ao longo da tabela.
>
> Certa vez alguém postou aqui na lista um endereço de blog ou site com
> dicas valiosas de como criar índices, se você pesquisar bem no
> histórico [1] vai encontrar.
>
> [1] https://www.postgresql.org.br/historico
>
>
> TIAGO J. ADAMI
> http://www.adamiworks.com
> @tiadami
> 

Ola Tiago, obrigado pela explicação.

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

Re: [pgbr-geral] Funcão PostgreSQL 9.2

2016-05-05 Por tôpico drum.lu...@gmail.com
Só para deixar registrado.. consegui fazer funcionar, segue código para
futuras pesquisas:


ALTER TABLE public.companies ADD COLUMN client_code_increment integer;
> ALTER TABLE public.companies ALTER COLUMN client_code_increment SET NOT
> NULL;
> ALTER TABLE public.companies ALTER COLUMN client_code_increment SET
> DEFAULT 1000;
> COMMIT TRANSACTION;
>
> BEGIN;
> -- Creating the function
> CREATE OR REPLACE FUNCTION users_code_seq()
>RETURNS "trigger" AS $$
> DECLARE code character varying;
> BEGIN
> -- if it's an insert, then we update the client_code_increment column
> value to +1
> IF (TG_OP = 'INSERT') THEN
> UPDATE public.companies SET client_code_increment =
> (client_code_increment + 1) WHERE id = NEW.company_id;
> END IF;
> -- IF the customer didn't provide a code value, we insert the next
> available from companies.client_code_increment
> IF NEW.code IS NULL THEN
> SELECT client_code_increment INTO NEW.code FROM public.companies
> as c WHERE c.id = NEW.company_id ORDER BY client_code_increment DESC;
> END IF;
> RETURN NEW;
> END;
> $$ LANGUAGE plpgsql;
> -- Creating the trigger
> CREATE TRIGGER tf_users_code_seq
>BEFORE INSERT
>ON public.users
>FOR EACH ROW
>EXECUTE PROCEDURE users_code_seq();
>
> COMMIT TRANSACTION;
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Funcão PostgreSQL 9.2

2016-05-05 Por tôpico drum.lu...@gmail.com
Estou tendo problemas para adequar a function ao que eu preciso:

INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,company_id)
> VALUES (66,'tes...@test.com','password','0','2016-05-03
> 00:01:01','2016-05-03 00:01:01','15');


- Note como eu não estou fornecendo dados para a coluna "code". Recebo o
erro em seguida.

> ERROR:  query returned no rows
> CONTEXT:  PL/pgSQL function users_code_seq() line 7 at SQL statement


- Se eu incluir o valor como default, recebo o mesmo erro

> INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id)
> VALUES (4,'te...@test.com','password','0','2016-05-03
> 00:01:01','2016-05-03 00:01:01',default,'2');

I get the same error

- Por favor, se alguém puder ajudar com isto... não sei onde estou
errando...

*Como estou fazendo meus tests?:*

*1 -*

CREATE OR REPLACE FUNCTION users_code_seq()
>RETURNS "trigger" AS $$
> DECLARE code character varying;
> BEGIN
> IF NEW.code IS NULL THEN
> SELECT client_code_increment INTO STRICT NEW.code FROM
> public.companies WHERE id = NEW.id ORDER BY client_code_increment DESC;
> END IF;
> IF (TG_OP = 'INSERT') THEN
> UPDATE public.companies SET client_code_increment =
> (client_code_increment + 1) WHERE id = NEW.id;
> END IF;
> RETURN NEW;
> END;
> $$ LANGUAGE plpgsql;


*2 - *

*companies.client_code_increment:*

ALTER TABLE public.companies ADD COLUMN client_code_increment integer;
> ALTER TABLE public.companies ALTER COLUMN client_code_increment SET NOT
> NULL;
> ALTER TABLE public.companies ALTER COLUMN client_code_increment SET
> DEFAULT 1000;


*3 - *

*Trigger:*

> CREATE TRIGGER tf_users_code_seq
>BEFORE INSERT
>ON public.users
>FOR EACH ROW
>EXECUTE PROCEDURE users_code_seq();




*4 - Insert dentro da tabela companies, para cadastrar duas empresas:*

> INSERT INTO
> public.companies(id,name,created_at,updated_at,client_code_increment)
> VALUES (1,'Company 1','2016-05-03 00:01:01','2016-05-03 00:01:01',default);
> - *PASS*
> INSERT INTO
> public.companies(id,name,created_at,updated_at,client_code_increment)
> VALUES (2,'Company 2','2016-05-03 00:01:01','2016-05-03
> 00:01:01',default);  *- PASS*


*5 - insert dentro da tabela users, para cadastrar os usuários:*

> INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id)
> VALUES (1,'te...@test.com','password','0','2016-05-03
> 00:01:01','2016-05-03 00:01:01','default','2'); -
> *PASS*INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id)
> VALUES (2,'te...@test.com','password','0','2016-05-03
> 00:01:01','2016-05-03 00:01:01',default,'1'); -
> *NO PASS*INSERT INTO public.users
> (id,email,encrypted_password,sign_in_count,created_at,updated_at,code,company_id)
> VALUES (3,'te...@test.com','password','0','2016-05-03
> 00:01:01','2016-05-03 00:01:01',default,'2'); - *NO PASS*


Se alguém puder ajudar... obrigado.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral