Postgresql
WHERE 子句中未使用的列
我在我們的程式碼庫中找到了這個查詢:
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;