7

私はこの種の削除クエリを持っています:

DELETE 
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)

これを最適化する方法はありますか?

4

2 に答える 2

3

(NOT) IN通常、代わりに使用することで最適化できます(NOT) EXISTS

DELETE 
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)

ここで何をしようとしているのかはわかりませんが、このクエリは、後で混乱を解消するためにクエリを実行するのではなく、これらの種類の制約を強制するために外部キーを使用する必要があることを示しています。

于 2012-09-16T08:00:16.703 に答える
3

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
于 2012-09-17T08:22:35.223 に答える