请选择 进入手机版 | 继续访问电脑版
楼主: ZQZ520
2239 0

构建百万级数据量表的方法 [推广有奖]

  • 2关注
  • 49粉丝

院士

17%

还不是VIP/贵宾

-

威望
4
论坛币
-1176554 个
通用积分
6481.7282
学术水平
99 点
热心指数
203 点
信用等级
94 点
经验
31673 点
帖子
655
精华
7
在线时间
2457 小时
注册时间
2014-5-7
最后登录
2021-8-4

ZQZ520 在职认证  发表于 2014-5-16 15:23:59 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
                                             前两个实验是前一段自己做的。后面的实验是一本书上的
实验环境:虚拟机,LINUX+ORACLE 11G
说明:每个实验完成后,需要及时删除表,以便进行下一个实验。 我这里节约篇幅,省略了。
删除重新开始下一个实验
drop table test1 purge;
drop table test2 purge;
truncate table test3;
drop table test3 purge;
alter system flush shared_pool;




方法一:使用布尔积,速度很快。
BYS@ bys001>create table test1 as select rownum a from dual connect by rownum<1001;
BYS@ bys001>alter system flush shared_pool;
BYS@ bys001>create table test3 as select a.* from test1 a,test1 b;


Table created.


Elapsed: 00:00:01.63
BYS@ bys001>select count(*) from test3;


  COUNT(*)
----------
   1000000
##########################################################################


方法二:利用自查询插入,速度比较慢。


BYS@ bys001>create table test1 as select rownum a from dual connect by rownum<10001;


Table created.


Elapsed: 00:00:00.25
begin
for i in 1 .. 10 loop
insert into test1 select * from test1;
end loop;
commit;
end;
/


PL/SQL procedure successfully completed.
Elapsed: 00:00:43.62
BYS@ bys001>select count(*) from test1;


  COUNT(*)
----------
   1024000


Elapsed: 00:00:00.02


插入速度是每秒两万多条
BYS@ bys001>select 1024000/43 from dual;


1024000/43
----------
23813.9535


19:34:16 SQL>  select t.sql_text, t.sql_id,t.PARSE_CALLS, t.EXECUTIONS
           2    from v$sql t
           3   where sql_text like '%INSERT INTO TEST1%' and rownum <10;
           


SQL_TEXT                       SQL_ID        PARSE_CALLS EXECUTIONS
------------------------------ ------------- ----------- ----------


INSERT INTO TEST1 SELECT * FRO cwjfx8x2zfvq1           1         10


批量提交节约了每次提交时 commit耗费的时间。
但是在大DML事务时,要注意延迟块清除可能引起的ORA-01555错误。在此不多说这个问题。
########################################################


方法三:创建存储过程,未使用绑定变量。速度很慢
这里只插入100万条数据来测试,因为插入1000万条数据需要时间太长(一个小时左右)。


create or replace procedure proc_test1
as
begin
for i in 1 .. 1000000
loop
execute immediate
'insert into test1 values ( '||i||')';
commit;
end loop;
end;
/


Procedure created.
BYS@ bys001>create table test1(a number);
BYS@ bys001>alter system flush shared_pool;
BYS@ bys001>exec proc_test1;


PL/SQL procedure successfully completed.


Elapsed: 00:13:03.43
BYS@ bys001>select count(*) from test1;


  COUNT(*)
----------
   1000000


每秒插入一千多条数据,数据条数除所用时间
BYS@ bys001>select 1000000/13/60 from dual;


1000000/13/60
-------------
   1282.05128
SQL>  select t.sql_text, t.sql_id,t.PARSE_CALLS, t.EXECUTIONS
  2    from v$sql t
  3   where sql_text like '%insert into test1 %' and rownum <10;


SQL_TEXT                                          SQL_ID        PARSE_CALLS EXECUTIONS
------------------------------------------------ ------------- ----------- ----------
insert into test1 values ( 991386)                4d4ywgu81n009           1          1
insert into test1 values ( 997580)                 0mg9u6mx6s00j           1          1
insert into test1 values ( 997063)                 gfkpbx0av000w           1          1
insert into test1 values ( 992660)                 3pruwwdb00026           1          1
insert into test1 values ( 997621)                27acn7hja802u           1          1
###########################################################################
方法四:使用绑定变量,一次解析,多次执行
create or replace procedure proc_test1
as
begin
for i in 1 .. 1000000
loop
execute immediate
'insert into test1 values (:aaa)' using i;
commit;
end loop;
10  end;
11  /


Procedure created.


Elapsed: 00:00:02.02
BYS@ bys001>create table test1(a number);
BYS@ bys001>alter system flush shared_pool;
BYS@ bys001>exec proc_test1;


PL/SQL procedure successfully completed.


Elapsed: 00:04:20.11

SQL> select t.sql_text, t.sql_id,t.PARSE_CALLS, t.EXECUTIONS
  2    from v$sql t
  3   where sql_text like '%insert into test1 %' and rownum <10;


SQL_TEXT                       SQL_ID        PARSE_CALLS EXECUTIONS
------------------------------ ------------- ----------- ----------
insert into test1 values (:aaa 7mj20sj5apmsf)           0    1000000
                                            
每秒可以插入将近4千条数据,速度是未使用绑定变量时的3倍多点。
BYS@ bys001>select 1000000/260 from dual;


1000000/260
-----------
3846.15385
###########################################################










二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Successfully successful EXECUTION completed Procedure system create purge 虚拟机 LINUX




CDA数据分析交流群 217748971
您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-28 16:38