问题描述
问题很明显。假设一个INSERT ALL语句的格式如下:
INSERT ALL
INTO myTable (id,cola,colb,colc) VALUES (id,'a','b','c')
INTO myTable (id,'c')
...
SELECT * FROM dual;
现在假设这三个点代表5k INTO子句。所有唯一ID,并且列数相同。
以这种方式可以插入表中的最大行数是多少?
解决方法
尽管INSERT ALL
没有理论上的最大行数,但实际上,您希望将行数保持在低位。
正如我在this answer中所演示的那样,Oracle可以轻松处理数百行,但是有一个不可思议的数字,解析时间开始呈指数增长。在旧版本中,在500行时情况变得非常糟糕。使用19c,性能成为成千上万行的问题。以下是快速测试的结果:
# of Rows Time in Seconds
--------- ---------------
1000 0.4
2000 1.7
3000 4
4000 12
5000 24
由于我不了解的原因,UNION ALL
方法往往工作更快。因此,您可能希望将行数限制为数百行,并使用如下语句:
INSERT INTO myTable (id,cola,colb,colc)
SELECT 'a','b','c' FROM dual UNION ALL
SELECT 'a','c' FROM dual UNION ALL
...
SELECT 'a','c' FROM dual;
,
据我所知,是无限的。 列的数量限制为999,但是行数...天空是限制。