[SQL] Memory exhausted

2001-06-11 Thread David Richter

Hello!

I used a self written funtion in plpgsql with a database  of 2 Gigabyte
size. My server has 384 Megabytes of RAM.

So I got this error by calling the following function:

psql:restructure.sql:139: FATAL 1:  Memory exhausted in AllocSetAlloc()
pqReadData() -- backend closed the channel unexpectedly.
This probably means the backend terminated abnormally
before or while processing the request.
psql:restructure.sql:139: connection to server was lost

In the memory usage program Its shown that the function needs all the
memory.


The function fetches all XXX rows of a table
and writes a value to another table

CREATE FUNCTION series_image () RETURNS integer AS '
DECLARE 

psr_rec record;
i integer := 0;

BEGIN 
FOR psr_rec IN SELECT * FROM relseries_image000 LOOP
UPDATE image 
SET seriesoid  = psr_rec.parentoid
WHERE chilioid = psr_rec.childoid;
i := i + 1;
END LOOP;
IF NOT FOUND THEN RETURN -1; 
ELSE RETURN i;
END IF;
END;

' LANGUAGE 'plpgsql';

What could I optimize in this function above?
I tried the Select statement in the psql command and it has taken 20
minutes. I estimate that there are more than 40 rows in the table.
Then it breakes , the announcment appears: malloc: Resource temporarily
unavailable
and psql is crashed.

Should I change the postmaster parameters?
actually they are :
./postmaster -i -S -D/usr/local/pgsql/data -B 256 -o -e -o -F

What can I do?
Thanks in advance for any advice

David

begin:vcard 
url;quoted-printable:http://mbi.DKFZ-Heidelberg.de/=0D=0A
n:M. Richter;David
x-mozilla-html:FALSE
org:Deutsches Krebsforschungszentrum;Division Medizinische und Biologische Informatik
version:2.1
email;internet:[EMAIL PROTECTED]
adr;quoted-printable:;;Im Neuenheimer Feld 280 url: http://mbi.DKFZ-Heidelberg.de/=0D=0AD-69120 Heidelberg, Germany  ;Heidelberg;Germany;;
x-mozilla-cpt:;-15296
fn:David M. Richter
end:vcard



---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]



[SQL] Re: select distinct too slow

2001-06-11 Thread Hans-Jürgen Schönig

Did you vacuum analyse your table after creating the index?
A solution for your problem would be to turn sequential scans ofd before querying the 
table.
This should work somehow like that:

myjava=# SET enable_seqscan TO 'off';
SET VARIABLE
myjava=# show enable_seqscan;
NOTICE:  enable_seqscan is off
SHOW VARIABLE

check out the docs for further information.

Hans




---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]



[SQL] Re: seleting all dates between two dates

2001-06-11 Thread Hans-Jürgen Schönig

Jeff Barrett schrieb:

> I am interested in a query where I can select all dates between two dates. I
> figure I can build a table of all valid dates with a resonable range and
> then select from that table, but I would like to use the power of sql to get
> the work done without building a date table. Any ideas?
>
> For example:
> I want all dates between 05-29-2001 and 06-02-2001
> The result set would be:
> 05-30-2001
> 05-31-2001
> 06-01-2001
>
> Thanks for the help.
> -Jeff

In my opinion there is no reasonable way to solve your problem by using SQL
only
Why don't you use a temporary table created by a simple PL/pgSQL function?

Hans


---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]



Re: [SQL] Memory exhausted

2001-06-11 Thread Tom Lane

David Richter <[EMAIL PROTECTED]> writes:
> I used a self written funtion in plpgsql with a database  of 2 Gigabyte
> size. My server has 384 Megabytes of RAM.

> So I got this error by calling the following function:

> psql:restructure.sql:139: FATAL 1:  Memory exhausted in AllocSetAlloc()

Try updating to Postgres 7.1.

regards, tom lane

---(end of broadcast)---
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]



[SQL] Table design issue....

2001-06-11 Thread pierre

Hi all,

  I've got a situation where I need to be able to query for the
same sort of data across multiple tables. Let me give some example
tables then explain.

create table t1 (
  t_attr1 text[],
  t_attr2 text[]
);
create table a1 (
  a_attr1 text[],
  a_attr2 text[]
);
create table c1 (
  c_attr1 text[],
  c_attr2 text[],
  c_attr3 text[]
);

In each of the above tables *_attr*[1] contains a flag that determines
what type of attribute it is. 
t1.t_attr1[1] == a1.a_attr2[1] == c1_.c_attr3[1] == FLAG
In otherwords, the attribute with the specific flag in quesiton is not 
known at runtime, unless I keep a table with the column names and table
names setup. Also, new *1 tables could be created dynamically with new attr*'s, 
and the number of columns within the tables isn't going to be the same.

What I need to be able to do is say something like:
"For ALL *1 tables with *_attr*[1] == FLAG return rows with
VALUE"

Ideas? Comments? Suggestions? Am I being crazy?

Pierre



[SQL] problem with Pl/Pgsql function

2001-06-11 Thread Matteo Centenaro

Hi I have a problem with this function:

Declare

rec_struttura record;
rec_camp record;
prov int;
estra_capo int;
id_lista int;
estra_non int;
rand int8;
count int;
count_estra int;
count_id int;
rand_doub float8;
row int8;
occ boolean;
note varchar;
pre char(4) /*NOT NULL := '02'*/;
tel char(13) /*NOT NULL := '342522'*/;
com int;
citta char(35);
nome varchar;
num int4;
data_oggi date;
capo int;
cap char(5);
capo_bool boolean;

Begin

For rec_struttura in Select * From struttura_campione Loop

/* estraggo i dati della provincia considerata */

prov := rec_struttura.cod_prov;
estra_capo := rec_struttura.num_capo;
estra_non := rec_struttura.num_non_capo;

/* estrazione dei nominativi nel capoluogo */
capo := 1;
count_estra := 0;

/* modificato andrea*/
<>
while (count_estra < estra_capo) Loop

count_estra := count_estra + 1;


/*modificato andrea*/
/*Select into rand PERFORM random ();*/
/* in ogni caso bisogna rimappre rand da o al ROW_COUNT della 
select, 
immagino che così vada piu'
veloce il tutto anche perche' rand arriva fino a 
2^31-1 ;) */

rand_doub:= random() ;
  count := 0;

/* Questa select quante volte viene ripetuta? tante volte 
quanti sono i 
soggetti da estrarre? */

For rec_camp in Select 
note,prefisso,telefono1,cod_com,cod_prov,citta,nome_cogno,capoluo,estrazione,num_estra,cap
 
>From nominativi inner join comuni on citta = nome_com Where ((cod_prov = 
prov) and (capoluo=capo)) Loop

/* bisogna trovare un modo piu' figo per beccare il 
record
altrimenti fa troppi giri dentro sti cicli */
GET DIAGNOSTICS row = ROW_COUNT;
rand := round (rand_doub * row);

if (rand > row) then

/*questo l'ho messo perche' altrimenti alla 
fine ne estrae meno di 
quelli che servono*/

exit caso;
end if;

count := count + 1;
if count = rand then
/* modificato andrea, prima la 
condizione "not occ" */
if not rec_camp.occupato then
note := rec_camp.note;
pre := rec_camp.prefisso;
tel := rec_camp.telefono1;
if pre IS NULL or tel IS NULL 
then
exit caso;
end if;
com := rec_camp.cod_com;
citta := rec_camp.citta;
cap := rec_camp.cap
nome := rec_camp.nome_cogno;
num := rec_camp.num_estra;
capo := rec_camp.capoluo;
exit;

else count_estra := count_estra -1; exit caso;
end if;
end if;

End Loop; /* end del for*/


/* estraggo i dati dal record prescelto */
/*note := rec_camp.note;
pre := rec_camp.prefisso;
tel := rec_camp.telefono1;
com := rec_camp.cod_com;
citta := rec_camp.citta;
nome := rec_camp.nome_cogno;*/

/* faccio l'update di occupato */

/*num := rec_camp.num_estra;*/
num := num + 1;
data_oggi := now();

update nominativi set occupato = TRUE, num_estra = num, 
estrazione = 
data_oggi Where ((prefisso = pre) and (telefono1 = tel));

/* faccio l'insert su tab_estrazioni */

id_lista := nextval('tab_estrazioni_id_seq');
 

[SQL] finding a maximum or minimum sum

2001-06-11 Thread Michael Richards

I have a table that looks like so:
userid | amount
---
   1   |  $500
   2   |  $400
   2   | $-100
   2   |   $10
   3   |   $10
   3   |   $10

I run a select sum(amount) from payments group by userid
userid | sum
--
  1| $500
  2| $310
  3|  $20

I need to modify this query so it returns the minimum, maximum and 
average sums. Is there any way I can do this?

-Michael
_
 http://fastmail.ca/ - Fast Free Web Email for Canadians
---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://www.postgresql.org/search.mpl



Re: [SQL] finding a maximum or minimum sum

2001-06-11 Thread Tom Lane

"Michael Richards" <[EMAIL PROTECTED]> writes:
> I run a select sum(amount) from payments group by userid
> I need to modify this query so it returns the minimum, maximum and 
> average sums. Is there any way I can do this?

You need two levels of grouping/aggregating to make that happen.
In 7.1 you can do it directly:

select min(amtsum), max(amtsum), avg(amtsum)
from (select sum(amount) as amtsum from payments group by userid) ss;

In prior versions you'd need to do the initial select into a temp
table and then select min/max/avg from that.

regards, tom lane

---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://www.postgresql.org/search.mpl



Re: [SQL] finding a maximum or minimum sum

2001-06-11 Thread Michael Richards

Prfect! This is exactly what I needed. Didn't know postgres 
supported subselects like that. Thanks.

-Michael

> select min(amtsum), max(amtsum), avg(amtsum)
> from (select sum(amount) as amtsum from payments group by userid)
> ss;
>
> In prior versions you'd need to do the initial select into a temp
> table and then select min/max/avg from that.

_
 http://fastmail.ca/ - Fast Free Web Email for Canadians
---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

http://www.postgresql.org/users-lounge/docs/faq.html