Re: [pgbr-geral] Dúvida em select
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
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
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