Postgresql

WHERE 子句中未使用的列

  • April 6, 2022

我在我們的程式碼庫中找到了這個查詢:

DELETE FROM "Foo"
WHERE ("Foo"."Id", "Foo"."CreatedAt")
IN (SELECT "f"."Id", "f"."CreatedAt"
   FROM "Foo" AS "f"
   WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);

它刪除在目前時間之前創建的記錄。

這給出了相同的結果:

DELETE FROM "Foo"
WHERE "Foo"."CreatedAt"
IN (SELECT "f"."CreatedAt"
   FROM "Foo" AS "f"
   WHERE "f"."CreatedAt" <= CURRENT_TIMESTAMP);

我不知道為什麼Foo.Id在子句中包含WHERE—— 可能是來自各種重構的剩餘垃圾(例如,它可以用於批量刪除ORDER BY "f"."Id" LIMIT 1000)。但是因為是PK,所以捨不得刪,說不定是有原因的。

是否有理論/性能原因將其放在那裡,或者這兩個查詢是否等效?

(這同時針對 postgres 和 sqlite。)

這兩個查詢都非常複雜。採用

DELETE FROM "Foo"
WHERE "CreatedAt" < current_timestamp;

引用自:https://dba.stackexchange.com/questions/310614