當在子SELECT中出現鎖定子句時,鎖定的行是那些由子查詢返回到外部查詢的行。由於來自外部查詢的條件可能被用於優化子查詢的執行,所以這可能涉及比檢查單獨的子查詢更少的行。例如,無法理解PostgreSQL有關FOR UPDATE行鎖定的文檔
SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;
將僅鎖定col1 = 5的行,即使該條件在文本上並不在子查詢中。
有人可以幫我瞭解了一句「這可能涉及比子查詢的檢查獨自建議更少的行,因爲從外部查詢條件可能會被用來優化子查詢的執行」?
我的理解是,「鎖定的行是那些通過子查詢返回到外部查詢」,所以無論子查詢返回(在本例中爲所有行),那些行必須鎖定?爲什麼只有co1 = 5被鎖定
謝謝!我不會想出這個隱式優化,我還可以如何顯式鎖定行?我不想做表鎖 – Zanko
@Zanko你可以這樣做,沒關係。您只需瞭解關於哪些行被鎖定的含義。有時候使用CTE('WITH' query)將它分成可以控制執行的步驟是很有用的。 –