5
我這種刪除查詢:如何優化DELETE .. NOT IN .. SUBQUERY在火鳥
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
還有什麼辦法來優化呢?
我這種刪除查詢:如何優化DELETE .. NOT IN .. SUBQUERY在火鳥
DELETE
FROM SLAVE_TABLE
WHERE ITEM_ID NOT IN (SELECT ITEM_ID FROM MASTER_TABLE)
還有什麼辦法來優化呢?
您可以使用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
(NOT) IN
通常可以通過使用(NOT) EXISTS
來代替優化。
DELETE
FROM SLAVE_TABLE
WHERE NOT EXISTS (SELECT 1 FROM MASTER_TABLE M WHERE M.ITEM_ID = ITEM_ID)
我不知道你正在嘗試做的,但對我這個查詢表明您應該使用外鍵來執行這些類型的限制,無法運行查詢,清理殘局之後。
具有ON DELETE CASCADE規則的外鍵將自動執行作業。 –
當然,外鍵是最優的,但不幸的是,在這種情況下它太晚了。 – Harriv
好吧,但是在你運行這個查詢之後,確保你添加了這樣一個約束(例如,按照Andrei建議的ON DELETE CASCADE)。 –