我创建了一组100k插入查询,以在多个oracle表中生成数据以进行性能测试。执行此操作的最佳方法是什么?
过去,我尝试过Oracle SQL Developer和Toad之类的工具。但是不确定是否可以处理这么大的数量。
简单的插入语句,例如-
INSERT INTO SELLING_CODE (SELC_ID, VALC_ID, PROD_ID, SELC_CODE, SELC_MASK, VALC_ID_STATUS)
VALUES (5000001, 63, 1, '91111111', 'N/A', 107);
答案 0 :(得分:2)
使用SQL语句插入100,000行是 fine 。它不是大量数据,并且有一些简单的技巧可以帮助您将运行时间缩短到几秒钟。
首先,确保您的工具没有为每个语句显示内容。将语句复制并粘贴到工作表窗口中将非常慢。但是将语句保存到SQL * Plus脚本中,然后运行该脚本会很快。如果可能,请使用真实的SQL * Plus客户端。该程序几乎可以在任何系统上使用,并且擅长运行小型脚本。
如果必须使用SQL Developer,请将100K语句保存在文本文件中,然后将其作为脚本运行(F5)。这种方法在我的PC上花费了45秒。
set feedback off
@C:\temp\test1.sql
第二,批处理SQL语句以消除开销。您不必全部批处理,一次批处理100条语句就足以减少99%的开销。例如,生成这样的一千条语句:
INSERT INTO SELLING_CODE (SELC_ID, VALC_ID, PROD_ID, SELC_CODE, SELC_MASK, VALC_ID_STATUS)
select 5000001, 63, 1, '91111111', 'N/A', 107 from dual union all
select 5000001, 63, 1, '91111111', 'N/A', 107 from dual union all
...
select 5000001, 63, 1, '91111111', 'N/A', 107 from dual;
将其保存在文本文件中,然后在SQL Developer(F5)中以相同的方式运行。这种方法在我的PC上花了4秒钟。
set feedback off
@C:\temp\test1.sql
如果您不能显着更改INSERT
语句的格式,则只需在每100行之间添加一个BEGIN
和END; /
。它将一次向服务器传递100条语句,并大大减少了网络开销。
要获得更快的速度,请在常规SQL * Plus中运行脚本。在我的PC上,加载100,000行只需2秒。
对于这样的中型数据,保持SQL语句的便利性很有帮助。通过一些技巧,您可以获得与二进制格式几乎相同的性能。