一次全部插入时的最大行数

问题描述

问题很明显。假设一个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,但是行数...天空是限制。