[SQL] Meaning of "REMINDER from pgsql..."

2000-11-04 Thread [EMAIL PROTECTED]

What's the meaning of the "REMINDER from pgsql ..."
message?

I checked the page, and apparently everybody on the 
list got the message.

Should we accept or reject the action?


Troy





[SQL] PLPGSQL performance

2000-11-04 Thread kovacsz

I'm not sure I will be correct. Tom, could you please check this?

I usually work with many PLPGSQL functions. They are mostly same fast like
SQL functions. But now, I found a difference. My SQL function was much
more faster than the PLPGSQL one. I signed the "slow" statement in the
PLPGSQL function, see below. Sorry for the Hungarian column names and for
the missing tables. The appropriate functions are cikk_ikon_fast and
cikk_ikon_slow. Well...

CREATE TABLE cikk (
az SERIAL PRIMARY KEY,
nev varchar(80) NOT NULL,
mennyisegi_egyseg int4 NOT NULL REFERENCES mennyisegi_egyseg(az),
szin int4 NOT NULL REFERENCES szin(az),
tipus int4 NOT NULL DEFAULT 1,
megjegyzes varchar(250),
felvitel_allapot int4 references cikkfelvitel_allapot
  NOT NULL DEFAULT 1);
CREATE INDEX ckk_ndx_nv on cikk using btree ( nev varchar_ops );

CREATE FUNCTION cikk_tipus (int4) RETURNS int4
  AS 'select tipus from cikk where $1 = az;'
  LANGUAGE 'SQL';

CREATE TABLE cikkstruktura (
fajta int4 NOT NULL REFERENCES cikk (az) on update cascade,
valtozat int4 NOT NULL REFERENCES cikk(az) ON DELETE CASCADE,
CONSTRAINT cikkstruktura_pk PRIMARY KEY (fajta, valtozat));
CREATE INDEX ckkstrktr_ndx_fjt on cikkstruktura using btree ( fajta int4_ops );
CREATE INDEX ckkstrktr_ndx_vltzt on cikkstruktura using btree ( valtozat int4_ops );

CREATE FUNCTION cikk_fajta (int4) RETURNS int4 as '
SELECT fajta FROM cikkstruktura WHERE valtozat = $1
AND cikk_tipus(fajta) = 3;
' LANGUAGE 'SQL';

CREATE FUNCTION cikk_ikon_fast(int4) RETURNS int4 AS 'SELECT (CASE
WHEN (cikk_fajta($1)=4) THEN (CASE
WHEN (cikk_tipus($1)=2) THEN 33 ELSE 32 END) ELSE (CASE
WHEN (cikk_fajta($1)=33) THEN (CASE
WHEN (cikk_tipus($1)=2) THEN 9 ELSE 8 END) ELSE -1 END) END)
FROM cikk; ' language 'sql';
-- Wow! A complex query! :-)

CREATE FUNCTION cikk_ikon_slow(int4) RETURNS int4 AS '
DECLARE
  _fajta int4;
  _elvi bool;
begin
  SELECT INTO _fajta, _elvi
cikk_fajta(az),
tipus = 2
FROM cikk WHERE az = $1;
-- This query makes it slow. The main part for being slow is:
-- _fajta := cikk_fajta($1), in short.

  if _fajta = 4 then
if _elvi then
  return 33;
else
  return 32;
end if;
  end if;
  if _fajta = 33 then 
if _elvi then
  return 9;
else
  return 8;
end if;
  end if;
  return -1; 
end;
' language 'plpgsql';
-- OK, this is much easier to understand, but slow.

--
In our application it is usual to call the function cikk_ikon a lot of
times. On my 233 MHz Pentium-2 the fast one is 1 sec, the slow one is 5
secs for ~1000 lines.

As I can explain, the reason why PLPGSQL function is slow, because it
sends more than one query to the backend instead of the SQL one, which
makes the backend to do only one query and this query is much more
optimized than those more ones separately. My theory in such optimizations
is to send as few queries to the backend as I can, preferring being the
queries much more complex instead of many and easy-to-process. 

Comments?

Regards, Zoltan







[SQL] Conditional SQL query

2000-11-04 Thread Indraneel Majumdar

Hi,

how can I insert a record after checking whether one of the fields has a
certain value or not? eg:

if table(col1)='value' insert into table values (x,x,x)

I am using perl interface. Is there any way to define a function to take
table name as an argument? (eg: select * from $table) I tried but this
gave an error (so I'm using perl to pass the real tablename for each
query)

Any help will be great,
Indraneel

/.
# Indraneel Majumdar  ¡  E-mail: [EMAIL PROTECTED]  #
# Bioinformatics Unit (EMBNET node),  ¡  URL: http://scorpius.iwarp.com  #
# Centre for DNA Fingerprinting and Diagnostics, #
# Hyderabad, India - 500076  #
`/