一,没有优化的速度: Executed in 69.436 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

create or replace procedure proc1

as

begin

for i in 1 .. 100000

loop

execute immediate

'insert into t values('||i||')';

commit;

end loop;

end;

/

下面查看下proc1插入100000记录的执行时间

SQL> set timing on;

SQL> exec proc1;

PL/SQL procedure successfully completed

Executed in 69.436 seconds

/*我们可以通过下面的语句查看此存储过程执行的具体步骤*/

select t.sql_text,t.sql_id,t.parse_calls,t.executions from v$sql t where sql_text like '%insert into t values%';

为了方便查看我用PL/SQL DEVELOPER 执行的上面语句,如下图:

从上面可以看出,每个语句都只是解析了一次,执行了一次,一共解析了10万次,也许你会问你上面只有7136行记录啊,你怎么说是解析了10万次呢。我可以告诉你肯定是解析了10万次,因为我的共享池空间不大,容纳不小10万条信息,根据FIFO 的原理你可以看出,现在我查出来的都是从92000多开始的SQL STATEMENT记录。我们知道这些SQL语句都是相似的没有必要解析10万次,即每一条语句都解析一次。这个PROC1 没有用绑定变量,这就是我们可以优化的地方。我们用绑定变量来重新测试下,下面的PROC2就只用解析一次就可以了,当然速度肯定会提高不少。

二,使用绑定变量优化后的速度: Executed in 26.505 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

create or replace procedure proc2

as

begin

for i in 1 .. 100000

loop

execute immediate

'insert into t values(:x)' using i;

commit;

end loop;

end;

/

SQL> set timing on;

SQL> exec proc2;

PL/SQL procedure successfully completed

Executed in 26.505 seconds

从上面可以看出,时间基本上减少了一半。

/*我们可以通过下面的语句查看此存储过程执行的具体步骤*/

select t.sql_text,t.sql_id,t.parse_calls,t.executions from v$sql t where sql_text like '%insert into t values%' order by 1;

从上面的执行情况可以知道,解析了一次,执行了10万次。完全符合我们的猜想,所以速度大大提升了。

execute immediate是一种动态SQL的写法,常用于表名字段名是变量,入参的情况,由于表名不知道,所以不能直接写SQL ,所以要靠动态SQL语句传人表名和字段名参数拼接成SQLSTATEMENT,有execute immediate调用执行。但是我的这个例子完全可以不需要动态的,可以用静态的写好。

三,用静态改写后的速度: Executed in 19.391 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

create or replace procedure proc3

as

begin

for i in 1 .. 100000

loop

insert into t values(i);

commit;

end loop;

end;

/

SQL> set timing on;

SQL> exec proc3;

PL/SQL procedure successfully completed

Executed in 19.391 seconds

从上面可以看出,proc3也实现了绑定变量,而且动态的特点是执行过程中再解析,而静态的SQL的特点是编译的过程是解析好的,所以上面的PRARSE_CALLS是0。注意这个和上面一个图比较,上面的时PARSE_CALLS 是1,而这个是0,所以静态的少了一个执行的时候的解析过程。

我们可以看出上面的三个PROC都是一条语句就commit一次,我们完全没有必要这样做,我们可以一起提交。如下例: commit的时把log_buffer里的信息通过LGWR写到online redo log里,触发LGWR写10万次,而且我们知道LGWR写的太频繁了。

四,批量提交的速度: Executed in 11.42 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

create or replace procedure proc4

as

begin

for i in 1 .. 100000

loop

insert into t values(i);

end loop;

commit;

end;

/

SQL> set timing on;

SQL> exec proc4;

PL/SQL procedure successfully completed

Executed in 11.42 seconds

可以看出我们用的时间更少了。

五,集合写法的速度: Executed in 0.452 seconds

drop table t purge;

create table t(x int);

/*清空共享池,注意在生产环境中千万不能做这步操作*/

alter system flush shared_pool;

/*下面的语句是由上面的一条一条的插入改为一整批的写进data buffer区里,所以比上面的快,批处理肯定比一个一个的执行快*/

insert into t select rownum from dual connect by level<=100000;

SQL> set timing on;

SQL> insert into t select rownum from dual connect by level<=100000;

100000 rows inserted

Executed in 0.452 seconds

这个是上面的前四种都是一条一条的插入的,我这个集合写法是一整批地写进到DATA BUFFER里,所以比上面的四种情况要快的多。

六,用直接路径写法速度(100万条记录): Executed in 1.514 seconds

/*下面用直接路径的方式来操作,速度会比上面更快,所谓直接路径就是数据不经过database buffer,而是直接写到磁盘,少了一步写到数据缓冲区(database buffer)的动作*/

drop table t purge;

alter system flush shared_pool;

SQL> set timing on;

SQL> create table t as select rownum x from dual connect by level<=1000000;

Table created

Executed in 1.514 seconds

注意此时我插入的记录数十上面的10倍,我是插入100万条记录只用了1.514 seconds.

注意:直接路径的写法比集合写法快事因为,insert into select .... 的方式是将数据首先写到data buffer里,然后再刷到磁盘里。而create as t 的方式跳过了数据缓冲区(data buffer), 直接写进磁盘中,这种方式称之为直接路径读写方式。本来是先到内存,在到磁盘,更改为直接到磁盘,少了一个步骤,所以速度快了。

七,并行写法的速度(100万条记录): Executed in 0.733 seconds

/*并行加直接路径,而且是不写日志的,所以速度比上面的更快*/

drop table t purge;

alter system flush shared_pool;

set timing on;

create table t nologging parallel 64 as select rownum x from dual connect by level<=100000;

SQL> set timing on;

SQL> create table t nologging parallel 4 as select rownum x from dual connect by level<=1000000;

Table created

Executed in 0.733 seconds

我上面只用了parallel 4,如果更多的话,还会更快!!!

oracle数据库速度测试,ORACLE数据库测试数据插入速度相关推荐

  1. oracle数据库基础测试,ORACLE数据库基础测试题oracle数据库复习题.docx

    <ORACLE数据库基础测试题oracle数据库复习题.docx>由会员分享,可在线阅读,更多相关<ORACLE数据库基础测试题oracle数据库复习题.docx(18页珍藏版)&g ...

  2. 游戏载入速度测试软件,游戏加载速度测试对比

    游戏加载速度测试对比 ● 使命召唤6 说到<使命召唤>系列游戏,对于喜欢FPS(第一人称射击)游戏的玩家来说,一定不会感到陌生,尤其是该系列的第四代<使命召唤4:现代战争>,以 ...

  3. oracle 乱码字符 测试,oracle 字符集乱码本质验证

    oracle 字符集乱码本质验证 发表于:2014-03-27来源:Csdn作者:蘑菇丁点击数: 之前一直困惑为什么数据库字符集和客户端字符集是一致的但是当数据库插入到表里却成了乱码,今天在群里看见一 ...

  4. oracle触发器的测试,ORACLE触发器的测试

    1.打开并登录pl/sql,File->New->Test Window; 2.在出现的窗口中的begin后输入脚本,该语句应该能够调用存储过程.函数,或语句能触发触发器: 比如我为某个表 ...

  5. Qt通过ODBC连接虚谷数据库,并对数据库数据进行增删查改

    目录 虚谷数据库 简介 测试虚谷数据库 虚谷数据库中系统表 win7搭建OBDC数据源 Qt连接数据库 通过QSqlDatabase的QODBC连接虚谷数据库 查询修改虚谷数据库中数据 测试案例 补充 ...

  6. 中文打字速度测试软件官网,中文打字速度测试软件

    使用该软件能够帮助用户测试自己的打字速度,阿宽中文打字速度测试软件专业的字数测试软件想知道自己打字速度水平赶快下载试试吧! 软件介绍: 中文打字速度测试软件是一款专业的用来测试打字速度的软件,软件安精 ...

  7. 打字速度测试php源码,在线测试打字速度(一分钟打字速度测试)

    我想短时间内提高我的打字速度然后练习五笔 金山打字就算了吧~太垃圾了 30. 五笔打字员 不用金山打字,也不下载任何的软件,只是在网页上联系测试一下的那种,要. 可以下载金山打字通,或者QQ五笔,可以 ...

  8. LoadRunner 测试Oracle数据库及Siebel性能

    本次测试使用的loadrunner 版本为8.1,oracle数据库版本为10.2.0.1,各版本的测试方法基本是一样的.这里提供loadrunner 8.1,10000个web用户的license: ...

  9. 3.数据库操作相关术语,Oracle认证,insert into,批量插入,update tablename set,delete和truncate的区别,sql文件导入

     1相关术语 语句 含义 操作 DML语句 (Data Manipulation Language) 数据库操作语言 insert update delete select DDL语言 (Date ...

  10. oracle加入生僻字,ORACLE数据库中如何插入生僻字

    ORACLE数据库中如何插入生僻字 发布时间:2020-08-16 23:44:09 来源:ITPUB博客 阅读:184 作者:巡完南山巡南山 本文转自oracle官方博客, 很多客户的数据库的字符集 ...

最新文章

  1. POJ 2186 Popular Cows
  2. CTFshow 命令执行 web56
  3. 鸿蒙系统布局,华为的布局,开始了!第二款鸿蒙系统产品,即将亮相
  4. HDU - 5919 Sequence II——主席树+区间种类++逆序建树
  5. spring实战(第4版读书笔记)
  6. System.arrayCopy()和普通数组复制之间的效率差别
  7. 学习PetShop3.0(9)工厂的资料
  8. Mac OS 源码 截屏工具
  9. 如何看待国内开源现状?贾扬清、李沐、陈天奇等大牛如是说
  10. win oracle卸载工具,[转]oracle windows 之完美卸载
  11. dede服务器建站_「建站篇」如何将本地搭建的织梦站点上传到服务器空间?
  12. Tomcat详细使用步骤
  13. 毕业设计-基于JSP实现医院病历管理系统
  14. “双 亲 委 派 机 制”
  15. signal函数详细用法
  16. 乔布斯震撼临终遗言首度公开!
  17. python作业:有一个学生成绩表,包括学号、姓名、高数、英语,计算机。 录入若干个学生学号、姓名、高数、英语,计算机5项数据。 将学生成绩表数据写入文件,文件名为“学生成绩表.txt
  18. 定时锁定计算机代码bat,用bat实现的自动关机的代码
  19. 基于Origin的一种SCI论文中给散点等图添加标签的方法
  20. python小游戏 五子棋小游戏设计与实现

热门文章

  1. 树莓派进阶之路 (027) - 在Linux中增加swap空间
  2. mysql 分库备份
  3. 自定义 Yasnippet 模板
  4. Sublime_配置插件
  5. 确认从博客园搬家到FPA博客园
  6. 集群介绍 keepalived介绍 用keepalived配置高可用集群
  7. shell日期加减及数组循环
  8. IDC预测:2021vCPE软硬件市场将达到30亿美元
  9. Git基础入门(一)Git基础概念
  10. centos 7 修改ip