Thread: SELECT INTO
Hi all I'm tring to do some trigger and I must use a SELECT INTO, look this: CREATE OR REPLACE FUNCTION f_lancamentos_pagos() RETURNS opaque AS ' DECLARE V_VALUE NUMERIC(12,2); DECLARE V_PAYMENT TIMESTAMP; begin if tg_op = ''INSERT'' then SELECT INTO V_PAYMENT "DATE_PAYMENT", V_VALUE "VALUE" FROM "PAYMENTS" WHERE "ID" = NEW.ID; .... end if end' LANGUAGE plpgsql; but, when this function is called I'm getting the following error message: ERROR: parser: parse error at or near '''''' but if do it in 2 SELECTs it runs normally.. SELECT INTO V_PAYMENT "DATE_PAYMENT" FROM "PAYMENTS" WHERE "ID" = NEW.ID; SELECT INTO V_VALUE "VALUE" FROM "PAYMENTS" WHERE "ID" = NEW.ID; so, if I want get 10 columns, must I do 10 SELETCs??? thats wrong there?? Roberto de Amorim - +55 48 346-2243 Software engineer at SmartBit Software Delphi and Interbase consultant roberto@smartbit.inf.br
Hi Everybody, I have this following query : select count(*) from "Data" where "IDOrigin"='29'; It's take more less 2 minutes to run... It's really slow... Some one maybe knows about how to optimize "select count" Below, there are the expalin analyse of the query. EXPLAIN ANALYZE select count(*) from "Data" where "IDOrigin"='29'; NOTICE: QUERY PLAN: Aggregate (cost=108945.77..108945.77 rows=1 width=0) (actual time=108845.29..108845.30 rows=1 loops=1) -> Seq Scan on Data (cost=0.00..107152.11 rows=717462 width=0) (actual time=18233.46..106927.60 rows=1457826 loops=1) Total runtime: 108845.50 msec. I did already a lot of optimization such as modify shared_buffers and sort_mem... But always too slow... Thanks, Areski
> EXPLAIN ANALYZE select count(*) from "Data" where "IDOrigin"='29'; > NOTICE: QUERY PLAN: > > Aggregate (cost=108945.77..108945.77 rows=1 width=0) (actual > time=108845.29..108845.30 rows=1 loops=1) > -> Seq Scan on Data (cost=0.00..107152.11 rows=717462 width=0) (actual > time=18233.46..106927.60 rows=1457826 loops=1) > Total runtime: 108845.50 msec. Well, do you have an index on Data.IDOrigin ? Regards, Bjoern
On Wednesday 13 Nov 2002 10:24 am, Roberto de Amorim wrote: > Hi all > > I'm tring to do some trigger and I must use a SELECT INTO, > look this: > > CREATE OR REPLACE FUNCTION f_lancamentos_pagos() RETURNS opaque AS > ' DECLARE V_VALUE NUMERIC(12,2); > DECLARE V_PAYMENT TIMESTAMP; > begin > if tg_op = ''INSERT'' then > SELECT INTO V_PAYMENT "DATE_PAYMENT", > V_VALUE "VALUE" > FROM "PAYMENTS" I think perhaps it should be: SELECT INTO V_PAYMENT,V_VALUE "DATE_PAYMENT","VALUE"... > so, if I want get 10 columns, must I do 10 SELETCs??? If you want 10 columns, you might prefer to select into a record variable and reference the columns as required. http://www.postgresql.org/idocs/index.php?plpgsql-statements.html -- Richard Huxton
"Roberto de Amorim" <roberto@smartbit.inf.br> writes: > SELECT INTO V_PAYMENT "DATE_PAYMENT", > V_VALUE "VALUE" > FROM "PAYMENTS" > WHERE > "ID" = NEW.ID; That's not the right syntax. Try SELECT INTO V_PAYMENT, V_VALUE "DATE_PAYMENT", "VALUE" FROM ... etc ... regards, tom lane
Yes of course... I have more less 2 millions of records on this table... ----- Original Message ----- From: "Björn Metzdorf" <bm@turtle-entertainment.de> To: <pgsql-general@postgresql.org> Sent: Wednesday, November 13, 2002 12:25 PM Subject: Re: [GENERAL] Performance : Optimize query > > EXPLAIN ANALYZE select count(*) from "Data" where "IDOrigin"='29'; > > NOTICE: QUERY PLAN: > > > > Aggregate (cost=108945.77..108945.77 rows=1 width=0) (actual > > time=108845.29..108845.30 rows=1 loops=1) > > -> Seq Scan on Data (cost=0.00..107152.11 rows=717462 width=0) (actual > > time=18233.46..106927.60 rows=1457826 loops=1) > > Total runtime: 108845.50 msec. > > Well, do you have an index on Data.IDOrigin ? > > Regards, > Bjoern > > > ---------------------------(end of broadcast)--------------------------- > TIP 2: you can get off all lists at once with the unregister command > (send "unregister YourEmailAddressHere" to majordomo@postgresql.org) >
On Wed, 13 Nov 2002, Areski wrote: > Hi Everybody, > > > I have this following query : select count(*) from "Data" where > "IDOrigin"='29'; > It's take more less 2 minutes to run... It's really slow... > Some one maybe knows about how to optimize "select count" > > Below, there are the expalin analyse of the query. > > > EXPLAIN ANALYZE select count(*) from "Data" where "IDOrigin"='29'; > NOTICE: QUERY PLAN: > > Aggregate (cost=108945.77..108945.77 rows=1 width=0) (actual > time=108845.29..108845.30 rows=1 loops=1) > -> Seq Scan on Data (cost=0.00..107152.11 rows=717462 width=0) (actual > time=18233.46..106927.60 rows=1457826 loops=1) > Total runtime: 108845.50 msec. Let's go through the normal stuff :) Have you used vacuum analyze recently? How many rows are in the table? How many rows actually have IDOrigin=29 (ie, is 717462 a valid estimate)? If it's not a reasonable estimate, you might want to raise the number of statistic buckets the column is getting (alter table "Data" alter column "IDOrigin" SET STATISTICS <number> where the default value is 10) and running vacuum analyze again.