Hello,
I have a curious situation involving a trigger, which I’m at a loss to explain.
I’m wondering if someone who knows more about the insides of SQLite can tell me
more about why it’s happening. I’m running SQLite 3.8.7.
The trigger code is at the bottom of this email. It’s a straightforward AFTER
UPDATE trigger, firing when any of three fields is updated and when the old
value is not the same as the new value for any of those fields. There’s also a
test I’ve put in there to make sure that some tables which I’m looking to
update are not empty.
The table TriggerLog is a table I’ve added for testing. If the trigger fires, a
row is inserted into the log. I have tested that this works when the trigger
fires.
There are then a number of UPDATE statements to set flags on other tables. In
the circumstances I’m running this in at the moment, there are no rows in
QuoteCalc, SaleCalc, TxnCalc etc., so the trigger’s code won’t actually fire. I
have verified this by inspecting TriggerLog after the text; there are no rows
reporting that ContactCalcUpdate8 has fired.
During the test, a row on ContactCalc has one of its ContactCalc_Phone,
ContactCalc_Email or ContactCalc_Website fields updated. This occurs on various
rows of ContactCalc approximately 5,000 times. This stage of the test takes
approximately 22 seconds.
If I remove all of the UPDATE rows from this trigger, and make no other
changes, the test takes approximately 12 seconds.
I don’t understand why removing code from the body of a trigger which doesn’t
fire makes things faster.
I have also tried replacing the WHERE clauses of all of the UPDATE statements
with WHERE 1=0 to eliminate the possibility of the IN statement being the
culprit; it’s still slow.
I would very much like to understand what’s going on here; perhaps someone can
enlighten me.
Thanks,
Hamish
// When ContactCalc's phone, email or website changes, update the phone, email
and website fields in
// QuoteCalc, SaleCalc, PurchaseCalc and TxnCalc.
// Also update GroupHead phone, email and web fields for QuoteCalc, SaleCalc,
PurchaseCalc, TxnCalc
CREATE TRIGGER ContactCalcUpdate8 AFTER UPDATE
OF ContactCalc_Phone,
ContactCalc_Email,
ContactCalc_Website
ON ContactCalc WHEN
(
Old.ContactCalc_Phone != New.ContactCalc_Phone
OR
Old.ContactCalc_Email != New.ContactCalc_Email
OR
Old.ContactCalc_Website != New.ContactCalc_Website
)
AND
(
(
SELECT COUNT(QuoteCalc_QuoteUUID) FROM QuoteCalc
) > 0
OR
(
SELECT COUNT(SaleCalc_SaleUUID) FROM SaleCalc
) > 0
OR
(
SELECT COUNT(PurchaseCalc_PurchaseUUID) FROM PurchaseCalc
) > 0
OR
(
SELECT COUNT(TxnCalc_TxnUUID) FROM TxnCalc
) > 0
)
BEGIN
INSERT INTO TriggerLog( TriggerLog_Name ) VALUES ('ContactCalcUpdate8');
UPDATE QuoteCalc
SET QuoteCalc_UpdateContactFlag = 1
WHERE QuoteCalc_ContactUUID = New.ContactCalc_ContactUUID;
UPDATE SaleCalc
SET SaleCalc_UpdateBillingContactFlag = 1
WHERE SaleCalc_SaleUUID IN
(
SELECT Sale_UUID
FROM Sale
WHERE Sale_BillingContactUUID = New.ContactCalc_ContactUUID
);
UPDATE SaleCalc
SET SaleCalc_UpdateShippingContactFlag = 1
WHERE SaleCalc_SaleUUID IN
(
SELECT Sale_UUID
FROM Sale
WHERE Sale_ShippingContactUUID = New.ContactCalc_ContactUUID
);
UPDATE TxnCalc
SET TxnCalc_UpdateContactFlag = 1
WHERE TxnCalc_TxnUUID IN
(
SELECT TxnCalc_TxnUUID
FROM TxnCalc
WHERE TxnCalc_ContactUUID = New.ContactCalc_ContactUUID
);
UPDATE PurchaseCalc
SET PurchaseCalc_UpdateContactFlag = 1
WHERE PurchaseCalc_PurchaseUUID IN
(
SELECT PurchaseCalc_PurchaseUUID
FROM PurchaseCalc
WHERE PurchaseCalc_ContactUUID = New.ContactCalc_ContactUUID
);
UPDATE ContactCalc
SET ContactCalc_UpdateGroupHeadFlag = 1
WHERE ContactCalc_ContactUUID IN
(
SELECT Contact_UUID
FROM Contact
WHERE Contact_LinkedContactUUID = New.ContactCalc_ContactUUID
);
UPDATE QuoteCalc
SET QuoteCalc_UpdateGroupHeadFlag = 1
WHERE QuoteCalc_QuoteUUID IN
(
SELECT Quote_UUID
FROM Quote,
Contact
WHERE Quote_ContactUUID = Contact_UUID
AND Contact_LinkedContactUUID = New.ContactCalc_ContactUUID
);
UPDATE SaleCalc
SET SaleCalc_UpdateBillingGroupHeadFlag = 1
WHERE SaleCalc_SaleUUID IN
(
SELECT Sale_UUID
FROM Sale,
Contact
WHERE Sale_BillingContactUUID = Contact_UUID
AND Contact_LinkedContactUUID = New.ContactCalc_ContactUUID
);
UPDATE SaleCalc
SET SaleCalc_UpdateShippingGroupHeadFlag = 1
WHERE SaleCalc_SaleUUID IN
(
SELECT Sale_UUID
FROM Sale,
Contact
WHERE Sale_ShippingContactUUID = Contact_UUID
AND Contact_LinkedContactUUID = New.ContactCalc_ContactUUID
);
UPDATE TxnCalc
SET TxnCalc_UpdateGroupHeadFlag = 1
WHERE TxnCalc_TxnUUID IN
(
SELECT Txn_UUID
FROM Txn,
Contact
WHERE Txn_ContactUUID = Contact_UUID
AND Contact_LinkedContactUUID = New.ContactCalc_ContactUUID
);
UPDATE PurchaseCalc
SET PurchaseCalc_UpdateGroupHeadFlag = 1
WHERE PurchaseCalc_PurchaseUUID IN
(
SELECT Purchase_UUID
FROM Purchase,
Contact
WHERE Purchase_ContactUUID = Contact_UUID
AND Contact_LinkedContactUUID = New.ContactCalc_ContactUUID
);
END;
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users