中是否有任何性能优势
INSERT INTO table1( column1) select * from table2;
反对
BEGIN
FOR t2Row IN SELECT * FROM table2 LOOP
EXECUTE 'INSERT INTO ...'
END LOOP;
END;
主要是对postgresql db引擎感兴趣。我相信第一个查询会消耗更多内存,因为它会缓冲整个结果,但是第一个查询会更快吗?
中是否有任何性能优势
INSERT INTO table1( column1) select * from table2;
反对
BEGIN
FOR t2Row IN SELECT * FROM table2 LOOP
EXECUTE 'INSERT INTO ...'
END LOOP;
END;
主要是对postgresql db引擎感兴趣。我相信第一个查询会消耗更多内存,因为它会缓冲整个结果,但是第一个查询会更快吗?
2条答案
按热度按时间cwdobuhd1#
这里有一个关于这个问题的答案:RBAR vs. Set based programming for SQL
我想说第一种方法比第二种方法快得多,因为它是基于集合的(正如marc_s所提到的)。
此外,第二种方法涉及切换到SQL,然后在循环的每次迭代中再次切换回来。我不是Postgres用户,但在Oracle中,这会导致上下文切换单独的性能开销,取决于所涉及的记录数量,它可能非常重要。
第一种方法也是最简单的,在大多数环境中,最简单的方法也是最容易支持的。
为了回答你的问题,第一种方法比第二种方法更快。
7ivaypg92#
如果你主要关心的是速度,那么第一种方法更快。
如果您主要关心的是在执行Insert时不会导致任何锁或降低同一表上其他查询的性能,那么For循环Insert是一个更好的选择。