一个 INSERT ALL 中的最大行数
Maximum number of rows in one 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 和相同的列数。
以这种方式可以插入到 table 中的最大行数是多少?
无限制,据我所知。 列数限制为999,但行数...天空是限制。
尽管 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', 'b', 'c' FROM dual UNION ALL
...
SELECT 'a', 'b', 'c' FROM dual;
问题比较明显。假设有一个 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 和相同的列数。
以这种方式可以插入到 table 中的最大行数是多少?
无限制,据我所知。 列数限制为999,但行数...天空是限制。
尽管 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', 'b', 'c' FROM dual UNION ALL
...
SELECT 'a', 'b', 'c' FROM dual;