Ich habe diese Art von Löschabfrage:Wie lösche zu optimieren .. NICHT IN .. UNTERABFRAGE in Firebird
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
dort ist eine Möglichkeit, dies zu optimieren?
Ich habe diese Art von Löschabfrage:Wie lösche zu optimieren .. NICHT IN .. UNTERABFRAGE in Firebird
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
dort ist eine Möglichkeit, dies zu optimieren?
Sie können EXECUTE BLOCK für das sequentielle Scannen von Detailtabellen und das Löschen von Datensätzen verwenden, für die kein Stammdatensatz gefunden wurde.
EXECUTE BLOCK
AS
DECLARE VARIABLE C CURSOR FOR
(SELECT d.id
FROM detail d LEFT JOIN master m
ON d.master_id = m.id
WHERE m.id IS NULL);
DECLARE VARIABLE I INTEGER;
BEGIN
OPEN C;
WHILE (1 = 1) DO
BEGIN
FETCH C INTO :I;
IF(ROW_COUNT = 0)THEN
LEAVE;
DELETE FROM detail WHERE id = :I;
END
CLOSE C;
END
(NOT) IN
kann normalerweise mit (NOT) EXISTS
stattdessen optimiert werden.
DELETE
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)
Ich bin nicht sicher, was Sie versuchen, hier zu tun, aber mir diese Abfrage zeigt an, dass Sie Fremdschlüssel verwenden sollen, um diese Art von Einschränkungen, nicht ausgeführt Abfragen Bereinigung des Chaos danach zu erzwingen.
Fremdschlüssel mit ON DELETE CASCADE Regel würde den Job automatisch erledigen. –
Fremdschlüssel wäre natürlich optimal, aber leider ist es in diesem Fall zu spät. – Harriv
Ok, aber nachdem Sie diese Abfrage ausgeführt haben, stellen Sie sicher, dass Sie eine solche Einschränkung hinzufügen (z. B. mit ON DELETE CASCADE wie von Andrei vorgeschlagen). –