He este tipo de consulta de eliminación:Cómo optimizar BORRAR .. .. NO EN subconsulta en Firebird
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
¿Hay alguna manera de optimizar este?
He este tipo de consulta de eliminación:Cómo optimizar BORRAR .. .. NO EN subconsulta en Firebird
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
¿Hay alguna manera de optimizar este?
Puede usar EXECUTE BLOCK para escanear secuencialmente la tabla de detalles y eliminar registros donde no coinciden registros maestros.
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
generalmente se puede optimizar utilizando (NOT) EXISTS
en su lugar.
DELETE
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)
no estoy seguro de lo que está tratando de hacer aquí, pero para mí esta consulta indica que se debe utilizar claves externas para imponer este tipo de restricciones, no ejecutar consultas para limpiar el desorden después.
La clave externa con la regla ON DELETE CASCADE haría el trabajo automáticamente. –
La clave externa sería óptima, por supuesto, pero desafortunadamente es demasiado tarde en este caso. – Harriv
Ok, pero después de ejecutar esta consulta, asegúrese de agregar dicha restricción (por ejemplo, con ON DELETE CASCADE como lo sugiere Andrei). –