ho questo tipo di query di eliminazione:Come ottimizzare DELETE .. NON IN .. subquery in Firebird
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
Ci sono un modo per ottimizzare questo?
ho questo tipo di query di eliminazione:Come ottimizzare DELETE .. NON IN .. subquery in Firebird
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
Ci sono un modo per ottimizzare questo?
È possibile utilizzare EXECUTE BLOCK per la scansione sequenziale della tabella dei dettagli e l'eliminazione dei record in cui nessun record master è abbinato.
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
può essere ottimizzato in genere utilizzando (NOT) EXISTS
.
DELETE
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)
io non sono sicuro di quello che si sta cercando di fare qui, ma a me questa domanda indica che si dovrebbe utilizzare chiavi esterne per far rispettare questo tipo di vincoli, non eseguire le query per la pulizia il pasticcio dopo.
La chiave esterna con la regola ON DELETE CASCADE esegue automaticamente il lavoro. –
Ovviamente la chiave esterna sarebbe ottimale, ma purtroppo in questo caso è troppo tardi. – Harriv
Ok, ma dopo aver eseguito questa query, assicurati di aggiungere un tale vincolo (es. Con ON DELETE CASCADE come suggerito da Andrei). –