0

We have one problem with two tables. Here is a example ER diagram of the both

ER DIAGRAM

We have a parent row TableA and many child rows in TableB. Both tables are bigger than this, but to resume the example, I think this is a good example.

TableB has two fields field1 and field2. When we insert in TableB, there is a before insert trigger which runs this query

 UPDATE TableA SET updated = NOW() WHERE id = NEW.id_b;

Then a before update trigger on TableA is triggered, which amongst other things it calculates the sum of the field1 and field2 of the child rows of TableA on the columns calc_field1 and calc_field2 respectively. Because this trigger perfoms lots of things is very slow.

In a process where we sequentially insert rows in TableB we added column notrigger that when set to 1,so it doesnt't runs the update on TableA because we are inserting a bunch of them. We change the TableB before insert trigger to this:

IF NEW.notrigger = 0 THEN
 UPDATE TableA SET updated = NOW() WHERE id = NEW.id_b;
END IF;

Then when we finish the process we manually make the update to perform the calculations.

 UPDATE TableA SET updated = NOW() WHERE id = 'X';

The problem here is that when we insert with notrigger = 1 it takes the same amount of time as if the TableA trigger is run, but that trigger isn't triggered because the condition isn't met. If we remove the if, the TableB trigger runs fast,as it should. If we change the if to something like this:

  IF NEW.notrigger = 0 THEN
     SET var = 10;
  END IF;

It also runs fast, but as we add an update to TableA, the times ramps up a lot.

We are working on combining the INSERT into one massive INSERT, but we would like to know why it takes the same amount of time when performing the update inside an if.

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Browse other questions tagged or ask your own question.