私はこの種の削除クエリを持っています:
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
これを最適化する方法はありますか?
私はこの種の削除クエリを持っています:
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
これを最適化する方法はありますか?
(NOT) IN
通常、代わりに使用することで最適化できます(NOT) EXISTS
。
DELETE
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)
ここで何をしようとしているのかはわかりませんが、このクエリは、後で混乱を解消するためにクエリを実行するのではなく、これらの種類の制約を強制するために外部キーを使用する必要があることを示しています。
EXECUTE BLOCK を使用して、ディテール テーブルを順次スキャンし、マスター レコードが一致しないレコードを削除できます。
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