Oracle中的体系结构:

oracle体系结构中的进程:

共享池相关的优化:

drop table t purge;
create table t as select * from dba_objects; set linesize 1000
set autotrace on
set timing on --第1次执行 select count(*) from t; --第2次执行
--该命令只是为了先不考虑解析的优化,单纯考虑第2次执行物理读减少带来的优化效应
alter system flush shared_pool;
select count(*) from t;

  

绑定变量带来的性能飞跃:

begin
for i in 1 .. 100000
loop
execute immediate
'insert into t values (:x)' using i;
end loop;
commit;
end;
/ select t.sql_text, t.sql_id, t.executions, t.parse_calls
from v$sql t
where sql_text like 'insert into t values%'; select t.sql_text, t.sql_id, t.executions, t.parse_calls
from v$sql t
where sql_text like 'insert into t values (:x)%'; SQL>--未使用绑定变量 SQL> begin
2 for i in 1 .. 100000
3 loop
4 execute immediate
5 'insert into t values ( '||i||')';
6 end loop;
7 commit;
8 end;
9 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 43.50 SQL>--使用绑定变量 SQL> begin
2 for i in 1 .. 100000
3 loop
4 execute immediate
5 'insert into t values ( :x )' using i;
6 end loop;
7 commit;
8 end;
9 / PL/SQL 过程已成功完成。 已用时间: 00: 00: 04.77

  硬解析次数和执行次数:

实验1
drop table t purge;
create table t ( x int );
alter system flush shared_pool;
exec dbms_workload_repository.create_snapshot();
set timing on
begin
for i in 1 .. 100000
loop
execute immediate
'insert into t values ( '||i||')';
end loop;
commit;
end;
/ exec dbms_workload_repository.create_snapshot(); @?/rdbms/admin/awrrpt.sql 实验2 drop table t purge;
create table t ( x int );
alter system flush shared_pool;
exec dbms_workload_repository.create_snapshot();
set timing on
begin
for i in 1 .. 100000
loop
execute immediate
'insert into t values ( :x )' using i;
end loop;
commit;
end;
/ exec dbms_workload_repository.create_snapshot(); @?/rdbms/admin/awrrpt.sql

  

执行语句:

drop table t purge;
create table t ( x int );
set linesize 266
set pagesize 5000
alter system flush shared_pool;
alter system flush buffer_cache;
alter session set events '10046 trace name context forever,level 12'; begin
for i in 1 .. 10000
loop
execute immediate
'insert into t values ( '||i||')';
end loop;
commit;
end;
alter session set events '10046 trace name context off';

--通过如下命令可以查出生成的trc文件

select d.value
|| '/'
|| LOWER (RTRIM(i.INSTANCE, CHR(0)))
|| '_ora_'
|| p.spid
|| '.trc' trace_file_name
from (select p.spid
from v$mystat m,v$session s, v$process p
where m.statistic#=1 and s.sid=m.sid and p.addr=s.paddr) p,
(select t.INSTANCE
FROM v$thread t,v$parameter v
WHERE v.name='thread'
AND(v.VALUE=0 OR t.thread#=to_number(v.value))) i,
(select value
from v$parameter
where name='user_dump_dest') d; exit

  生成报表:

tkprof  d:\oracle\diag\rdbms\test11g\test11g\trace/test11g_ora_4516.trc  d:\10046_no_bind.txt  sys=no sort=prsela,exeela,fchela

  

--查询10046.txt,发现总共是花费4.38秒,其中解析时间占用了3.3秒

---用10046来跟踪另外一个使用绑定变量的写法,如下:
drop table t purge;
create table t ( x int );
set linesize 266
set pagesize 5000
alter system flush shared_pool;
alter system flush buffer_cache;
alter session set events '10046 trace name context forever,level 12';
begin
for i in 1 .. 10000
loop
execute immediate
'insert into t values ( :x )' using i;
end loop;
commit;
end;
/
alter session set events '10046 trace name context off'; select d.value
|| '/'
|| LOWER (RTRIM(i.INSTANCE, CHR(0)))
|| '_ora_'
|| p.spid
|| '.trc' trace_file_name
from (select p.spid
from v$mystat m,v$session s, v$process p
where m.statistic#=1 and s.sid=m.sid and p.addr=s.paddr) p,
(select t.INSTANCE
FROM v$thread t,v$parameter v
WHERE v.name='thread'
AND(v.VALUE=0 OR t.thread#=to_number(v.value))) i,
(select value
from v$parameter
where name='user_dump_dest') d; tkprof d:\oracle\diag\rdbms\test11g\test11g\trace/test11g_ora_2908.trc d:\10046_bind.txt sys=no sort=prsela,exeela,fchela --查询10046.txt,发现总共是花费2.75秒,其中解析时间占用了0.03秒

  静态sql自动绑定变量:

drop table t purge;
create table t(x int);
alter system flush shared_pool;
select * from v$mystat where rownum=1;
set timing on begin
for i in 1 .. 100000
loop
insert into t values (i);
end loop;
commit;
end;
/ select t.sql_text, t.sql_id, t.executions, t.parse_calls
from v$sql t
where lower(sql_text) like 'insert into t values%';

  参数对Sql性能的影响:

drop table t purge;
create table t ( x int );
set timing on alter session set session_cached_cursors=0;
--使用绑定变量
begin
for i in 1 .. 100000
loop
execute immediate
'insert into t values ( :x )' using i;
end loop;
commit;
end;
/ drop table t purge;
create table t ( x int );
set timing on
alter session set session_cached_cursors=50;
--使用绑定变量
begin
for i in 1 .. 100000
loop
execute immediate
'insert into t values ( :x )' using i;
end loop;
commit;
end;
/ 说明:
oracle有一个概念,那就是session cursor cache,中文描述就是有一块内存区域,用来存储关闭了的cursor。
当一个cursor关闭之后,oracle会检查这个cursor的request次数是否超过3次,如果超过了三次,就会放入session cursor cache。
这样在下次parse的时候,就可以从session cursor cache中找到这个statement, session cursor cache的管理也是使用LRU。
session_cached_cursors这个参数是控制session cursor cache的大小的。
session_cached_cursors定义了session cursor cache中存储的cursor的个数。这个值越大,则会消耗的内存越多。

  

drop table t purge;
create table t as select * from dba_objects;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
commit; --测试普通插入
drop table test;
create table test as select * from dba_objects where 1=2;
set timing on
insert into test select * from t;
commit; --注意这个普通方式插入试验输出的物理读(首次读)
set autotrace traceonly
select count(*) from test; --测试直接路径读方式
drop table test;
create table test as select * from dba_objects where 1=2;
set timing on
insert /*+ append */ into test select * from t;
commit;
--注意这个直接路径方式插入试验输出的物理读(首次读)
set autotrace traceonly
select count(*) from test;

批量提交与否性能差异:

set serveroutput on size 100000
drop table t purge;
create table t(x int);
set timing on begin
for i in 1 .. 100000 loop
insert into t1 values (i);
commit;
end loop;
end;
/
drop table t purge;
create table t(x int); begin
for i in 1 .. 100000 loop
insert into t values (i);
end loop;
commit;
end;
/

  日志关闭与否对性能的影响:

--环境准备(构造一个记录有400万左右的表)
drop table t purge;
create table t as select * from dba_objects;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
insert into t select * from t;
--多插几次,让数据大一点
insert into t select * from t;
insert into t select * from t;
commit; --测试直接路径读方式
drop table test;
create table test as select * from dba_objects where 1=2;
set timing on
insert /*+ append */ into test select * from t;
commit; --测试nolgging关闭日志+直接路径读方式
drop table test;
create table test as select * from dba_objects where 1=2;
alter table test nologging;
set timing on
insert /*+ append */ into test select * from t;
commit;

  

Oracle学习笔记(四)的更多相关文章

  1. oracle 学习笔记(四)

    1. SQL(高级查询) 1.1. 子查询 1.1.1. 子查询在WHERE子句中 在SELECT查询中,在WHERE查询条件中的限制条件不是一个确定的值,而是来自于另外一个查询的结果.为了给查询提供 ...

  2. Oracle学习笔记四

    一.PL/SQL编程 游标(光标Cursor) 为什么使用游标 在写java程序中有集合的概念,那么在pl/sq中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: C ...

  3. Oracle学习笔记四 SQL命令(二):SQL操作语言类别

    SQL分为下列语言类别 1.数据定义语言(DDL) Create.Alter.Drop 2.数据操纵语言(DML) Insert.Select.Delete.Update 3.事务控制语言(TCL) ...

  4. Oracle学习笔记(四)

    六.约束 1.约束的作用 定义规则:什么数据可以输入,什么不可以 确保完整性:数据的精确性和可靠性 2.Oracle五个重要的约束: 非空约束.主键约束.外键约束.检查约束.唯一约束. (1)非空约束 ...

  5. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  6. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

  7. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  8. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. oracle学习笔记第一天

    oracle学习笔记第一天 --oracle学习的第一天 --一.几个基础的关键字   1.select select (挑选) 挑选出显示的--列--(可以多列,用“,”隔开,*表示所有列),为一条 ...

随机推荐

  1. AttributeError: module ‘select’ has no attribute 'epoll’

    场景:mac 下导入的 ‘select’ 包 import select,然后在 主函数 中创建的 epoll 对象 epl = select.epoll(),运行报错如下 Traceback (mo ...

  2. Java解决java.io.FileNotFoundException: E:\work\work (拒绝访问。)

    一.问题 在使用FileInputStream或FileOutputStream时会遇到如下问题1和问题2. 问题1: java.io.FileNotFoundException: .\xxx\xxx ...

  3. 分享一个Python脚本--统计redis key类型数据大小分布

    概述 今天主要介绍怎么统计redis key类型数据大小分布. 原理:使用redis命令: scan.pipline.type 和 debug object 来得到 redis key 信息. 脚本 ...

  4. Http协议以及Httpclient

    一.HTTP之请求消息Request 客户端发送一个HTTP请求到服务器的请求消息包括以下格式: 请求行(request line).请求头部(header).空行和请求数据四个部分组成. Http请 ...

  5. 堆叠注入——BUUCTF-随便注

    由题目提示知道,这题需要进行sql注入 输入1'发现报错 再输入1';show batabases#出现了一大堆数据库 再输入1';show tables#出现了两个表 猜测flag在这2个表中,输入 ...

  6. Unity移动端入门 - Android那些事

    目录 大小1.92GB,ts格式,语言:中文 扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主

  7. 考勤打卡机导出的excel考勤时间表如何生成实用的考勤表

    该excel表有如下结构 姓名\日期 周1 周2 周3 周4 周5 张三 7:3518:02 7:3518:02 7:46   17:56 李四 7:3518:02 7:02 18:00 18:02 ...

  8. Token 安全登陆防止窃取

    HTTP 协议是无状态的 在web中使用cookie+session的技术来保持用户登陆的状态 移动端使用token来保持用户登陆状态由于token在网络中传输,很容易被 中间人获取,进而模拟用户进行 ...

  9. 关于uboot中的属性"u-boot,dm-pre-reloc”的意义

    "u-boot,dm-pre-reloc”属性:当设置了这个属性时,则表示这个设备在重定向之前就需要使用. 当dm_init_and_scan的参数为true时,只会对带有“u-boot,d ...

  10. 图解 https 单向认证和双向认证!

    来源: 一.Http HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议,所有WWW文件必须遵循的标准.HTTP协议传输的数据都是未加密的,也就是明 ...