嗯,然后用job去跑。 先测下大概1万条占多少空间,然后再设置执行次数为一次,然后for这里调大。 create or replace procedure proc_test_insert1 as var_send_id number; var_send_num varchar2(20); BEGIN for i in 1..50000 loop --调整这里的数字 select to_number(to_char(sysdate,'yyyyMMddHH24MISS')||trim(to_char(seq_send_id.nextVal,'00000000000'))) into var_send_id from dual; var_send_num :=substr(var_send_id,15,length(var_send_id)); insert into sms_message( task_id, sender_num, mobile_no, param_value ) values( --数据自己组织啊,比如主外键之类。 20081015201902000000000000000001, '10000', var_send_num, 'test中文' ); if mod(i,10000)=0 then commit; end if; end loop;end proc_test_insert1;/ VARIABLE jobno number; begin DBMS_JOB.SUBMIT(:jobno, 'proc_test_insert1;', SYSDATE,'SYSDATE + 10000'); commit; end; /
如果要讲快,找个同样的表,现在这个表填满数据.至于使用什么方法就很难说了.各有所爱.然后用这个表,直接去填充你那个表.insert into a select * from b
用测试数据填充表 --填充表 create proc [dbo].[filltable] (@rows int) as DECLARE @INT AS INT SET @INT = 0 WHILE @INT < @rows --这里设置需要插入多少行 BEGIN SET @INT = @INT + 1 INSERT INTO test (name) SELECT substring(cast(newid() as nvarchar(40)),0,10) END --exec filltable 900000000
declare flag number; begin --建临时表往测试表里插数据。根据测试表的表结构来更改 execute immediate 'create global temporary table xxxxtmp on commit preserve rows as select dbms_random.value(1,10000)col1,dbms_random.string('l',5)col2 from all_objects where rownum<10000'; loop select sign(sum(bytes)/power(1024,3)-10) into flag from user_extents where segment_type='TABLE' and segment_name='XXXXX';--要填充数据的表名 if flag>=0 then exit; end if;--检查表占用大小是否已达到10g。否的话继续循环插入 execute immediate 'insert into XXXX select * from xxxxtmp'; commit; end loop; end;
那这样的话,跟insert /* +APPEND */ into a select * from a 没有什么区别吧,我昨天就是这样子搞的,量大了之后,就很慢了。
用随机不一定能避开约束,如果有约束可以利用rownum来避开 一般使用connect by rownum<? + dbms_random包来生成测试数据,但是connect by rownum..在10g以后才有效,由于不知道你的版本,我用了all_objects表来代替。 一次插入1万或几万条数据,然后commit,可以避免撤销段的严重占用,提高插入速度 另,使用临时表的另一个原因是,既然只是测试数据,1万个随机数就差不多了,后面相同我想也没有关系,比起全部用随机生成数据,能进一步提高插入速度。 6楼的代码是基于这些理由写的(没考虑约束,如果有约束需要做相应处理)
select sign(sum(bytes)/power(1024,3)-10) into flag from user_extents where segment_type='TABLE' and segment_name='XXXXX';--要填充数据的表名 这个是查询表所占的字节数用的
方法一: 1.先计算一下10G大概要多少数据量 2.创建一个表t2,在这个表中插入1万数据 3.insert /*+ append */ into t1 nologging select * from t2,然后commit 4.update t2.... 5.重复3,4步方法二: 1.先计算一下10G大概要多少数据量 2. declare i int; TYPE varfield1 IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER; TYPE varfield2 IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER; begin for i in 1..1000000 loop varfield1(i) := 'aa' || to_char(i); varfield2(i) := 'bb' || to_char(i); end loop;
FORALL i in 1..1000000 insert into t1(field1, field2) values(varfield1(i), varfield2(i)); commit; end ; /
先测下大概1万条占多少空间,然后再设置执行次数为一次,然后for这里调大。
create or replace procedure proc_test_insert1
as
var_send_id number;
var_send_num varchar2(20);
BEGIN
for i in 1..50000 loop --调整这里的数字
select to_number(to_char(sysdate,'yyyyMMddHH24MISS')||trim(to_char(seq_send_id.nextVal,'00000000000'))) into var_send_id from dual;
var_send_num :=substr(var_send_id,15,length(var_send_id));
insert into sms_message(
task_id,
sender_num,
mobile_no,
param_value
)
values( --数据自己组织啊,比如主外键之类。
20081015201902000000000000000001,
'10000',
var_send_num,
'test中文'
);
if mod(i,10000)=0 then
commit;
end if;
end loop;end proc_test_insert1;/
VARIABLE jobno number;
begin
DBMS_JOB.SUBMIT(:jobno,
'proc_test_insert1;',
SYSDATE,'SYSDATE + 10000');
commit;
end;
/
create proc [dbo].[filltable]
(@rows int)
as
DECLARE @INT AS INT
SET @INT = 0
WHILE @INT < @rows --这里设置需要插入多少行
BEGIN
SET @INT = @INT + 1
INSERT INTO test (name) SELECT substring(cast(newid() as nvarchar(40)),0,10)
END
--exec filltable 900000000
flag number;
begin
--建临时表往测试表里插数据。根据测试表的表结构来更改
execute immediate 'create global temporary table xxxxtmp on commit preserve rows as select dbms_random.value(1,10000)col1,dbms_random.string('l',5)col2 from all_objects where rownum<10000';
loop
select sign(sum(bytes)/power(1024,3)-10) into flag from user_extents where segment_type='TABLE' and segment_name='XXXXX';--要填充数据的表名
if flag>=0 then exit; end if;--检查表占用大小是否已达到10g。否的话继续循环插入
execute immediate 'insert into XXXX select * from xxxxtmp';
commit;
end loop;
end;
那这样的话,跟insert /* +APPEND */ into a select * from a
没有什么区别吧,我昨天就是这样子搞的,量大了之后,就很慢了。
一般使用connect by rownum<? + dbms_random包来生成测试数据,但是connect by rownum..在10g以后才有效,由于不知道你的版本,我用了all_objects表来代替。
一次插入1万或几万条数据,然后commit,可以避免撤销段的严重占用,提高插入速度
另,使用临时表的另一个原因是,既然只是测试数据,1万个随机数就差不多了,后面相同我想也没有关系,比起全部用随机生成数据,能进一步提高插入速度。
6楼的代码是基于这些理由写的(没考虑约束,如果有约束需要做相应处理)
这个是查询表所占的字节数用的
1.先计算一下10G大概要多少数据量
2.创建一个表t2,在这个表中插入1万数据
3.insert /*+ append */ into t1 nologging select * from t2,然后commit
4.update t2....
5.重复3,4步方法二:
1.先计算一下10G大概要多少数据量
2.
declare
i int;
TYPE varfield1 IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER;
TYPE varfield2 IS TABLE OF varchar2(30) INDEX BY BINARY_INTEGER;
begin for i in 1..1000000 loop
varfield1(i) := 'aa' || to_char(i);
varfield2(i) := 'bb' || to_char(i);
end loop;
FORALL i in 1..1000000
insert into t1(field1, field2)
values(varfield1(i), varfield2(i));
commit;
end ;
/
2、利用rownum虚拟列生成递增的整数数据;
3、利用sysdate函数加一些简单运算来生成日期数据,本例中是每条记录的时间加1秒;
4、利用dbms_random.value函数生成随机的数值型数据,本例中是生成0到100之间的随机整数;
5、利用dbms_random.string函数生成随机的字符型数据,本例中是生成长度为20的随机字符串,字符串中可以包括字符或数字。
ok,那要生成10万条测试记录表可以用如下SQL:
create table myTestTable as
select rownum as id,
to_char(sysdate + rownum/24/60*60, 'yyyy-mm-dd hh24:mi:ss') as inc_datetime,
trunc(dbms_random.value(0, 100)) as random_id,
dbms_random.string('x', 20) random_string
from dual