Thread: Trigger vs Rule
Hi all. There are two tables: create table device_types ( id int, name varchar ); about 1000 rows create table devices ( id int, type int REFERENCES device_types(id), name varchar, data float ); about 200000 rows And about 1000 functions: create function device_type1(int) returns .. create function device_type2(int) returns .. ... create function device_type1000(int) returns .. What is faster? One trigger with 1000 ELSE IF if old.type=1 then select device_type1(old.id); else if old.type=2 then select device_type2(old.id); ... else if old.type=1000 then select device_type1000(old.id); end if; Or 1000 rules create rule device_type1 AS ON update to devices where old.type=1 DO select device_type1(old.id); create rule device_type2 AS ON update to devices where old.type=2 DO select device_type2(old.id); ... create rule device_type1000 AS ON update to devices where old.type=1000 DO select device_type1000(old.id); thx. -- С уважением, Ключников А.С.
On 2 apr 2006, at 10.31, Ключников А.С. wrote: > What is faster? > One trigger with 1000 ELSE IF > Or 1000 rules Faster to write and easier to maintain would be to write a trigger function in pl/pgsql which executes the right function dynamically: CREATE OR REPLACE FUNCTION exec_device_type() RETURNS trigger AS $$ EXECUTE "SELECT device_type" || OLD.type || "(OLD.id)"; $$ LANGUAGE plpgsql; Best would probably be to refactor your device_typeN() functions into one, that would take N as an argument. Sincerely, Niklas Johansson
On 2 apr 2006, at 23.08, Niklas Johansson wrote: > CREATE OR REPLACE FUNCTION exec_device_type() RETURNS trigger AS $$ > EXECUTE "SELECT device_type" || OLD.type || "(OLD.id)"; > $$ LANGUAGE plpgsql; Sorry, I was bitten by the bedbug there: a plpgsql function needs a little more than that to be functional :) CREATE OR REPLACE FUNCTION exec_device_type() RETURNS trigger AS $$ BEGIN EXECUTE 'SELECT device_type' || OLD.type || '(OLD.id)'; RETURN NEW/OLD/NULL; -- Depending on your application. END; $$ LANGUAGE plpgsql; But really, you should consider reworking your schema structure. Having a thousand functions doing almost the same thing is neither efficient, nor maintainable. Sincerely, Niklas Johansson
* Niklas Johansson <spot@tele2.se> [2006-04-03 11:04:25 +0200]: > > On 2 apr 2006, at 23.08, Niklas Johansson wrote: > > >CREATE OR REPLACE FUNCTION exec_device_type() RETURNS trigger AS $$ > > EXECUTE "SELECT device_type" || OLD.type || "(OLD.id)"; > >$$ LANGUAGE plpgsql; > > > Sorry, I was bitten by the bedbug there: a plpgsql function needs a > little more than that to be functional :) > > CREATE OR REPLACE FUNCTION exec_device_type() RETURNS trigger AS $$ > BEGIN > EXECUTE 'SELECT device_type' || OLD.type || '(OLD.id)'; > RETURN NEW/OLD/NULL; -- Depending on your application. > END; > $$ LANGUAGE plpgsql; > > But really, you should consider reworking your schema structure. > Having a thousand functions doing almost the same thing is neither > efficient, nor maintainable. Things are very diferent. For many types functions not needed, jast update. I.e. This is a way One trigger with ~1000 else if. Here was a diametral opinion. > > > > Sincerely, > > Niklas Johansson > > > > -- С уважением, Ключников А.С. Ведущий инженер ПРП "Аналитприбор" 432030 г.Ульяновск, а/я 3117 тел./факс +7 (8422) 43-44-78 mailto: alexs@analytic.mv.ru