postgresql “插入到选择”与“选择并循环插入”的性能差异

3pmvbmvn  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(2)|浏览(148)

中是否有任何性能优势

INSERT INTO table1( column1) select * from table2;

反对

BEGIN
FOR t2Row IN SELECT * FROM table2 LOOP
   EXECUTE 'INSERT INTO ...'
END LOOP;
END;

主要是对postgresql db引擎感兴趣。我相信第一个查询会消耗更多内存,因为它会缓冲整个结果,但是第一个查询会更快吗?

cwdobuhd

cwdobuhd1#

这里有一个关于这个问题的答案:RBAR vs. Set based programming for SQL
我想说第一种方法比第二种方法快得多,因为它是基于集合的(正如marc_s所提到的)。
此外,第二种方法涉及切换到SQL,然后在循环的每次迭代中再次切换回来。我不是Postgres用户,但在Oracle中,这会导致上下文切换单独的性能开销,取决于所涉及的记录数量,它可能非常重要。
第一种方法也是最简单的,在大多数环境中,最简单的方法也是最容易支持的。
为了回答你的问题,第一种方法比第二种方法更快。

7ivaypg9

7ivaypg92#

如果你主要关心的是速度,那么第一种方法更快。
如果您主要关心的是在执行Insert时不会导致任何锁或降低同一表上其他查询的性能,那么For循环Insert是一个更好的选择。

相关问题