当我遇到一个问题时,我正在研究 Postgres 的嵌套循环连接及其变体。 对于默认的嵌套循环连接,Postgres每次都会为外部的每个元组扫描内部关系(尽管没有选择好)。 另一方面,在物化嵌套循环连接的情况下,内部关系被扫描一次,上传到工作内存,并在内存中重新扫描外部关系中的每个元组。
这里的问题是在嵌套循环连接的循环期间是否可以由另一个查询插入数据。
如果可以插入数据,我认为物化嵌套循环连接和嵌套循环连接的结果会有所不同。
(实际上,我真的不知道嵌套循环连接中的循环是如何工作的。我试图将其理解为一个抽象概念,情况可能就是这样。)
下面的文档和 GPT 对我有所帮助,但我并不相信。 https://www.interdb.jp/pg/pgsql03/05/01.html
无论是否使用嵌套循环连接,并发数据修改都不会影响 PostgreSQL 中的查询结果。
在每个语句的开头(或者,如果事务隔离级别为
REPEATABLE READ
或更高,则在事务中的第一个语句的开头)PostgreSQL 会拍摄一个快照:它确定哪些事务可见,哪些事务不可见。正在进行或将来的事务永远不可见,因此它们的影响不会影响查询结果,即使它们在查询仍在运行时提交。