sql - 一个 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 和相同数量的列。
以这种方式可以插入到表中的最大行数是多少?
解决方案
虽然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;
推荐阅读
- mathematical-optimization - Xpress Mosel 为所有行返回零
- python - 如何在 python 中为 auth.gg api 正确地 request.post()
- python - 如何拆分列表中的句子?
- php - PHP fputcsv 添加不需要的值
- java - hsdis Windows 编译失败 - C 编译器无法创建可执行文件 - 错误 77、错误 2
- php - 从一个表中选择用户 id 并在另一个表中更新
- java - 未能执行目标 org.codehaus.mojo:exec-maven-plugin:3.0.0:java
- javascript - 输出中没有任何内容
- python - Unstack Groupby 没有使用 Pandas 将数据分组到正确的数据集中
- python - LCD 未使用新值更新