首页 > 解决方案 > 一个 INSERT ALL 中的最大行数

问题描述

这个问题比较明显。假设有一个如下形式的 INSERT ALL 语句:

INSERT ALL
INTO myTable (id, cola, colb, colc) VALUES (id, 'a', 'b', 'c')
INTO myTable (id, cola, colb, colc) VALUES (id, 'a', 'b', 'c')
INTO myTable (id, cola, colb, colc) VALUES (id, 'a', 'b', 'c')
...
SELECT * FROM dual;

现在假设这三个点代表 5k INTO 子句。所有唯一 id 和相同数量的列。

以这种方式可以插入到表中的最大行数是多少?

标签: sqloracleinsertlimit

解决方案


虽然INSERT ALL没有理论上的最大行数,但在实践中,您可能希望将行数保持在数百以下。

正如我在这个答案中演示的那样,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', 'b', 'c' FROM dual UNION ALL
...
SELECT 'a', 'b', 'c' FROM dual;

推荐阅读