性能调优

执行计划

  • 问题分析

打开活动查看系统缓存中的SPC执行计划缓存统计信息,发现SPC命中率十分的低。结果如下:

../../../../../../_images/image1133.png

图214 SPC执行计划命中率

也可以通过设置立即转储事件来查看spc命中情况。

设置SPC缓存信息转储,level设置为1,

表格1级别1:spc统计信息

Cache plans 当前缓存计划个数
Memory size 占用内存大小
Gets 请求次数
Hits 命中次数
Saves 保存次数
Save Success 保存正确次数
../../../../../../_images/image1142.png

图215 SPC缓存信息转储设置

SPC缓存信息转储结果如下,由SPC缓存信息转储文件内容也同样可以看出,spc缓存命中非常少,基本上接近于0。

../../../../../../_images/image1152.png

图216 SPC缓存信息转储文件内容

由于列a的类型是int,插入的数据是float类型,由于类型不匹配导致执行计划不会被命中。

调优过程

调优结果

../../../../../../_images/image1162.png

图217 SPC执行计划命中率

同上我们也可以通过设置SPC缓存信息转储查看,设置过程同上。在最终的spc转储文件中我们可以看到总请求次数和命中次数等的大概情况,命中次数比率明显提升。

../../../../../../_images/image1172.png

图218 调优后的SPC缓存信息转储文件内容

表格 2

名称 修改前 修改后 性能提升百分比(1 - 修改后/修改前)
SPC命中率 0 66  
程序运行时间 139922(ms) 102141(ms) 27%

日志IO

问题分析

打开运行时诊断工具,在历史数据分析和对比功能页面上,选择监控等待事件,同时保存快照(日志IO1),执行数据插入程序,执行完毕后再保存快照(日志IO2),查看快照进行分析。结果如下:

../../../../../../_images/image1182.png

图219 低?

../../../../../../_images/image1192.png

图220 差值图

通过数据图和差值图比较来看 LogPhysicalWriteIOWait 为4044,LogForceFlushWait为4378 是等待时间最长的,在历史数据分析和对比功能页面上,选择监控用户,同时保存快照(保存点1),执行数据插入程序,执行完毕后再保存快照(保存点2),查看快照进行分析。通过图 203差值图对分析每次插入都要提交一次增加了对磁盘写入的操作。

../../../../../../_images/image1202.png

图221 差值图

调优过程

修改:把所有的数据保存到缓存区中,所有插入运行完后在提交,减少对磁盘的操作。修改后代码如下:

for(int i = 0; i < 100000; i++) {

st.executeUpdate("insert into t values("+12.0+",'asdasdadasdasdasdasdsadeweweweweweeweweweewwewe'," +

" 'weweweweeeeeewewewewewewwewewewewwewewewewe', " +

"'wewewewewewewewewewewewewewewewewewewwewweew'," +

"'sdfsfsffsdfdfsfsfsfdsdfdfsfdsfsdfsfsdfsddfdfds', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf'," +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

"'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

"'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

"'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf')");

}

conn.commit();

调优结果

修改后重复数据插入的操作插入之前保存快照(保存点3),插入之后保存快照(保存点4)对比结果如下。

../../../../../../_images/image1218.png

图222 差值图

LogPhysicalWriteIOWait 变为147,LogForceFlushWait为9 等待大幅度下降。,如下表说是:

表格3

名称 修改前 修改后 性能提升百分比(1 - 修改后/修改前)
LogPhysicalWriteIOWait 4044 147  
LogForceFlushWait 4378 9  
程序运行时间 139922(ms) 50734(ms) 63.7%

网络传输

问题分析

继续对代码进行优化,重复数据插入的操作插入之前保存快照(保存点2),插入之后保存快照(保存点1),如下图所示:

../../../../../../_images/image1222.png

图223 差值图

从差值图中可以看出发送和接收的字节都很大,插入主要是服务器接收,所以主要是降低服务器接收的IO来提高性能。

调优过程

1)PreparedStatement st = conn.prepareStatement("insert into t values(?," + " 'asdasdadasdasdasdasdsadeweweweweweeweweweewwewe'," +

" 'weweweweeeeeewewewewewewwewewewewwewewewewe', " +

" 'wewewewewewewewewewewewewewewewewewewwewweew'," +

" 'sdfsfsffsdfdfsfsfsfdsdfdfsfdsfsdfsfsdfsddfdfds'," +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf'," +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf'," +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf'," +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf', " +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf'," +

" 'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf')");

for(int i = 0; i < 100000; i++) {

st.setInt(1,i);

st.addBatch();

}

st.executeBatch();

2) 创建存储过程

create or replace procedure addValue() as

begin

for i in 1 .. 100000 loop

insert into t values(i, 'asdasdadasdasdasdasdsadeweweweweweeweweweewwewe',

'weweweweeeeeewewewewewewwewewewewwewewewewe',

'wewewewewewewewewewewewewewewewewewewwewweew',

'sdfsfsffsdfdfsfsfsfdsdfdfsfdsfsdfsfsdfsddfdfds',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf',

'sdfasdfasdfsafdasdfafsdfsdfsdfsdsdsdf');

end loop;

end;

修改代码为

CallableStatement st = conn.prepareCall("exec addValue();");

st.execute();

调优结果

  1. 预编译

把修改后的代码运行,重复数据插入的操作插入之前保存快照(保存点5),插入之后保存快照(保存点6),数据差值图如下:

../../../../../../_images/image1232.png

图224 差值图

在差值图中看出“保存点6到保存点5的差值”比“保存点2到保存点1”小了很多。说明修改是可行的。

表格 4

名称 修改前 修改后 性能提升百分比(1 - 修改后/修改前)
BYTES RECEIVED FROM CLIENT 61924118 1015417  
程序运行时间 50734(ms) 13094(ms) 74.1%

(2)存储过程

把修改后的代码运行,重复数据插入的操作插入之前保存快照(保存点7),插入之后保存快照(保存点8),数据差值图如下:

../../../../../../_images/image1242.png

图225 差值图

在差值图中看出“保存点8到保存点7的差值”比“保存点6到保存点5”小了很多。说明修改是可行的。

表格 5

名称 修改前 修改后 性能提升百分比(1 - 修改后/修改前)
BYTES RECEIVED FROM CLIENT 1015417 40326  
程序运行时间 13094(ms) 11013(ms) 15.9%

数据文件

重复数据插入的操作插入之前保存快照(日志IO1),插入之后保存快照(日志IO2)查看历史对照分析,如下图所示:

../../../../../../_images/image1252.png

图226 差值图

查看建议报告,如下图所示:

../../../../../../_images/image1262.png

图227 建议报告

建议报告中提示修改增大ceshi.data文件的扩展大小。

创建表空间 增大扩展大小和文件大小,减少数据库文件扩展的次数从而增加插入的速度。创建表空间sql语句修改为:

CREATE TABLESPACE system3 DATAFILE 'system3.data' SIZE 100m AUTOEXTEND ON NEXT 100m

创建表t1:

create table t1(a int, b varchar(50), c varchar(50), d varchar(50), e varchar(50), f varchar(50), g varchar(50), h varchar(50), i varchar(50), j varchar(50), k varchar(50), l varchar(50), m varchar(50), n varchar(50))tablespace system3;

运行插入程序,插入的表换成t1。

表格 6

名称 修改前 修改后 性能提升百分比(1 - 修改后/修改前)
程序运行时间 11013(ms) 10210(ms) 12%