有没有更好的 query/code 可以用更少的时间插入这些数据?
Is there a better query/code that will take less time to insert these data?
我正在尝试将数百万行插入到 table 中,如下面的代码所示。我想先插入 300 万行,然后插入 3000 万、3 亿行,依此类推。大概止步于3亿。
我这样做的原因是我想测试 table 的分区。我想在分区和未分区时在 select 或其他语句上测试 table。我做了第一次插入(300 万行),这花了 30 多分钟。
有没有更简单的插入数据的方法?
declare
c_id number := 0 ;
begin
while (c_id <= 3000000)
loop
INSERT all
when c_id <= 500000 then
into city
values(c_id,'City' || c_id || sysdate,'NY',c_id + 500 || sysdate)
when c_id between 500001 and 1000000 then
into city
values(c_id,'City' || c_id || sysdate,'CA',c_id + 500 || sysdate)
when c_id between 1000001 and 1500000 then
into city
values(c_id,'City' || c_id || sysdate,'TX',c_id + 500 || sysdate)
when c_id between 1500001 and 2000000 then
into city
values(c_id,'City' || c_id || sysdate,'WA',c_id + 500 || sysdate)
when c_id between 2000001 and 2500000 then
into city
values(c_id,'City' || c_id || sysdate,'NC',c_id + 500 || sysdate)
when c_id > 2500000 then
into city
values(c_id,'City' || c_id || sysdate,'SC',c_id + 500 || sysdate)
select 1 from dual;
c_id := c_id + 1;
end loop;
end;
以下是我生成测试数据的方式:
HUSQVIK@panel_management> CREATE TABLE CITIES (ID NUMBER NOT NULL, CITY VARCHAR2(100) NOT NULL, STATE VARCHAR2(2) NOT NULL, SOME_DATA VARCHAR2(255)) NOLOGGING;
Table created.
Elapsed: 00:00:00.01
HUSQVIK@panel_management> ALTER SESSION FORCE PARALLEL DML;
Session altered.
Elapsed: 00:00:00.00
HUSQVIK@panel_management> INSERT /*+ append */ INTO CITIES
2 WITH STATES AS (
3 SELECT 'NY' STATE, 1 ID_OFFSET FROM DUAL UNION ALL
4 SELECT 'CA' STATE, 2 ID_OFFSET FROM DUAL UNION ALL
5 SELECT 'TX' STATE, 3 ID_OFFSET FROM DUAL UNION ALL
6 SELECT 'WA' STATE, 4 ID_OFFSET FROM DUAL UNION ALL
7 SELECT 'NC' STATE, 5 ID_OFFSET FROM DUAL UNION ALL
8 SELECT 'SC' STATE, 6 ID_OFFSET FROM DUAL
9 ),
10 GENERATOR AS (
11 SELECT /*+ materialize cardinality(5000000) */ (LEVEL - 1) * 6 ID FROM DUAL CONNECT BY LEVEL <= 5000000
12 )
13 SELECT ID + ID_OFFSET, 'City' || (ID + ID_OFFSET) || SYSDATE, STATE, ID + 500 || SYSDATE
14 FROM GENERATOR CROSS JOIN STATES;
30000000 rows created.
Elapsed: 00:00:13.08
HUSQVIK@panel_management>
在 13 秒内生成并插入了 3000 万行。但这没有任何索引。即使 /*+ APPEND */ 也优化了它们的维护,每个索引都会显着减慢插入速度。
我正在尝试将数百万行插入到 table 中,如下面的代码所示。我想先插入 300 万行,然后插入 3000 万、3 亿行,依此类推。大概止步于3亿。
我这样做的原因是我想测试 table 的分区。我想在分区和未分区时在 select 或其他语句上测试 table。我做了第一次插入(300 万行),这花了 30 多分钟。
有没有更简单的插入数据的方法?
declare
c_id number := 0 ;
begin
while (c_id <= 3000000)
loop
INSERT all
when c_id <= 500000 then
into city
values(c_id,'City' || c_id || sysdate,'NY',c_id + 500 || sysdate)
when c_id between 500001 and 1000000 then
into city
values(c_id,'City' || c_id || sysdate,'CA',c_id + 500 || sysdate)
when c_id between 1000001 and 1500000 then
into city
values(c_id,'City' || c_id || sysdate,'TX',c_id + 500 || sysdate)
when c_id between 1500001 and 2000000 then
into city
values(c_id,'City' || c_id || sysdate,'WA',c_id + 500 || sysdate)
when c_id between 2000001 and 2500000 then
into city
values(c_id,'City' || c_id || sysdate,'NC',c_id + 500 || sysdate)
when c_id > 2500000 then
into city
values(c_id,'City' || c_id || sysdate,'SC',c_id + 500 || sysdate)
select 1 from dual;
c_id := c_id + 1;
end loop;
end;
以下是我生成测试数据的方式:
HUSQVIK@panel_management> CREATE TABLE CITIES (ID NUMBER NOT NULL, CITY VARCHAR2(100) NOT NULL, STATE VARCHAR2(2) NOT NULL, SOME_DATA VARCHAR2(255)) NOLOGGING;
Table created.
Elapsed: 00:00:00.01
HUSQVIK@panel_management> ALTER SESSION FORCE PARALLEL DML;
Session altered.
Elapsed: 00:00:00.00
HUSQVIK@panel_management> INSERT /*+ append */ INTO CITIES
2 WITH STATES AS (
3 SELECT 'NY' STATE, 1 ID_OFFSET FROM DUAL UNION ALL
4 SELECT 'CA' STATE, 2 ID_OFFSET FROM DUAL UNION ALL
5 SELECT 'TX' STATE, 3 ID_OFFSET FROM DUAL UNION ALL
6 SELECT 'WA' STATE, 4 ID_OFFSET FROM DUAL UNION ALL
7 SELECT 'NC' STATE, 5 ID_OFFSET FROM DUAL UNION ALL
8 SELECT 'SC' STATE, 6 ID_OFFSET FROM DUAL
9 ),
10 GENERATOR AS (
11 SELECT /*+ materialize cardinality(5000000) */ (LEVEL - 1) * 6 ID FROM DUAL CONNECT BY LEVEL <= 5000000
12 )
13 SELECT ID + ID_OFFSET, 'City' || (ID + ID_OFFSET) || SYSDATE, STATE, ID + 500 || SYSDATE
14 FROM GENERATOR CROSS JOIN STATES;
30000000 rows created.
Elapsed: 00:00:13.08
HUSQVIK@panel_management>
在 13 秒内生成并插入了 3000 万行。但这没有任何索引。即使 /*+ APPEND */ 也优化了它们的维护,每个索引都会显着减慢插入速度。