当锁定子句出现在子SELECT中时,锁定的行是子查询返回到外部查询的行。这可能涉及比单独检查子查询所建议的更少的行,因为来自外部查询的条件可能用于优化子查询的执行。例如,
SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;
将仅锁定具有col1 = 5的行,即使该条件在子查询中不是文本上的。
有人可以帮助我理解句子"这可能涉及的行数少于单独检查子查询所表明的行数,因为来自外部查询的条件可能用于优化子查询的执行&#34 ;
我的理解是"锁定的行是由子查询返回到外部查询的行"所以无论子查询返回(在这种情况下是所有行),那些行必须锁定?为什么只有co1 = 5被锁定
答案 0 :(得分:1)
如果子查询实际运行,则子查询仅锁定行。
有时PostgreSQL可能会注意到它可以跳过执行外部查询的部分以节省时间,而不会影响查询返回的行。
对于一个过于简单的例子,如果你写
SELECT * FROM my_table WHERE (SELECT ... FROM othertable WHERE ... FOR UPDATE) = 1 AND FALSE;
PostgreSQL可以自由地锁定来自othertable
的零行,因为它可以证明跳过子查询的执行不会影响查询的结果。
在文档的示例中,重点是如果存在col1 = 4,col1 = 6等的行,那些行可能不会被锁定,因为PostgreSQL可以检查条件{ {1}}并确定该行在执行子查询之前不匹配。但是推论是,如果PostgreSQL首先决定执行子查询,它们也可以锁定。
我强烈建议您将明确的行锁定作为CTE或类似工具的一部分进行,并且完全清楚将要执行的内容以及将要执行的操作。