一张空表,结构固定,没有一条数据,有主/外键的约束。要求:最快的给其填充数据,使用其占用的空间达到10G.高手们赐教!!!

解决方案 »

  1.   

    嗯,然后用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;
    /
      

  2.   

    如果要讲快,找个同样的表,现在这个表填满数据.至于使用什么方法就很难说了.各有所爱.然后用这个表,直接去填充你那个表.insert into a select * from b
      

  3.   

    用测试数据填充表 --填充表
    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
      

  4.   

    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;
      

  5.   


    那这样的话,跟insert /* +APPEND */ into a select * from a
    没有什么区别吧,我昨天就是这样子搞的,量大了之后,就很慢了。
      

  6.   

    不要用a表对自己插入,用个临时表b,b的记录数为1万条左右,每插入1次,commit一次
      

  7.   

    临时表没有任何约束索引什么的, sqlloder先把数据塞进去, 再分析有没有主键冲突
      

  8.   

    http://tech.e800.com.cn/articles/2009/1214/1260770811194_1.html大家看看上面链接中的方法如何?个人感觉挺好用的。用随机避开约束。
      

  9.   

    用随机不一定能避开约束,如果有约束可以利用rownum来避开
    一般使用connect by rownum<? + dbms_random包来生成测试数据,但是connect by rownum..在10g以后才有效,由于不知道你的版本,我用了all_objects表来代替。
    一次插入1万或几万条数据,然后commit,可以避免撤销段的严重占用,提高插入速度
    另,使用临时表的另一个原因是,既然只是测试数据,1万个随机数就差不多了,后面相同我想也没有关系,比起全部用随机生成数据,能进一步提高插入速度。
    6楼的代码是基于这些理由写的(没考虑约束,如果有约束需要做相应处理)
      

  10.   

    select sign(sum(bytes)/power(1024,3)-10) into flag from user_extents where segment_type='TABLE' and segment_name='XXXXX';--要填充数据的表名 
    这个是查询表所占的字节数用的
      

  11.   

    方法一:
    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 ;
       /
      

  12.   

    我曾经看到这篇文章"Oracle中如何用一条SQL快速生成10万条测试数据" 注:此文于2009-12-09被推荐到CSDN首页。挺好的!建议楼主去搜一搜。
      

  13.   

    1、利用Oracle特有的“connect by”树形连接语法生成测试记录,“level <= 100000”表示要生成100000记录;
    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