Обсуждение: 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