性能调优¶
执行计划¶
- 问题分析
打开活动查看系统缓存中的SPC执行计划缓存统计信息,发现SPC命中率十分的低。结果如下:
图214 SPC执行计划命中率
也可以通过设置立即转储事件来查看spc命中情况。
设置SPC缓存信息转储,level设置为1,
表格1级别1:spc统计信息
| Cache plans | 当前缓存计划个数 |
|---|---|
| Memory size | 占用内存大小 |
| Gets | 请求次数 |
| Hits | 命中次数 |
| Saves | 保存次数 |
| Save Success | 保存正确次数 |
图215 SPC缓存信息转储设置
SPC缓存信息转储结果如下,由SPC缓存信息转储文件内容也同样可以看出,spc缓存命中非常少,基本上接近于0。
图216 SPC缓存信息转储文件内容
由于列a的类型是int,插入的数据是float类型,由于类型不匹配导致执行计划不会被命中。
调优过程
调优结果
图217 SPC执行计划命中率
同上我们也可以通过设置SPC缓存信息转储查看,设置过程同上。在最终的spc转储文件中我们可以看到总请求次数和命中次数等的大概情况,命中次数比率明显提升。
图218 调优后的SPC缓存信息转储文件内容
表格 2
| 名称 | 修改前 | 修改后 | 性能提升百分比(1 - 修改后/修改前) |
|---|---|---|---|
| SPC命中率 | 0 | 66 | |
| 程序运行时间 | 139922(ms) | 102141(ms) | 27% |
日志IO¶
问题分析
打开运行时诊断工具,在历史数据分析和对比功能页面上,选择监控等待事件,同时保存快照(日志IO1),执行数据插入程序,执行完毕后再保存快照(日志IO2),查看快照进行分析。结果如下:
图219 低?
图220 差值图
通过数据图和差值图比较来看 LogPhysicalWriteIOWait 为4044,LogForceFlushWait为4378 是等待时间最长的,在历史数据分析和对比功能页面上,选择监控用户,同时保存快照(保存点1),执行数据插入程序,执行完毕后再保存快照(保存点2),查看快照进行分析。通过图 203差值图对分析每次插入都要提交一次增加了对磁盘写入的操作。
图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)对比结果如下。
图222 差值图
LogPhysicalWriteIOWait 变为147,LogForceFlushWait为9 等待大幅度下降。,如下表说是:
表格3
| 名称 | 修改前 | 修改后 | 性能提升百分比(1 - 修改后/修改前) |
|---|---|---|---|
| LogPhysicalWriteIOWait | 4044 | 147 | |
| LogForceFlushWait | 4378 | 9 | |
| 程序运行时间 | 139922(ms) | 50734(ms) | 63.7% |
网络传输¶
问题分析
继续对代码进行优化,重复数据插入的操作插入之前保存快照(保存点2),插入之后保存快照(保存点1),如下图所示:
图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();
调优结果
- 预编译
把修改后的代码运行,重复数据插入的操作插入之前保存快照(保存点5),插入之后保存快照(保存点6),数据差值图如下:
图224 差值图
在差值图中看出“保存点6到保存点5的差值”比“保存点2到保存点1”小了很多。说明修改是可行的。
表格 4
| 名称 | 修改前 | 修改后 | 性能提升百分比(1 - 修改后/修改前) |
|---|---|---|---|
| BYTES RECEIVED FROM CLIENT | 61924118 | 1015417 | |
| 程序运行时间 | 50734(ms) | 13094(ms) | 74.1% |
(2)存储过程
把修改后的代码运行,重复数据插入的操作插入之前保存快照(保存点7),插入之后保存快照(保存点8),数据差值图如下:
图225 差值图
在差值图中看出“保存点8到保存点7的差值”比“保存点6到保存点5”小了很多。说明修改是可行的。
表格 5
| 名称 | 修改前 | 修改后 | 性能提升百分比(1 - 修改后/修改前) |
|---|---|---|---|
| BYTES RECEIVED FROM CLIENT | 1015417 | 40326 | |
| 程序运行时间 | 13094(ms) | 11013(ms) | 15.9% |
数据文件¶
重复数据插入的操作插入之前保存快照(日志IO1),插入之后保存快照(日志IO2)查看历史对照分析,如下图所示:
图226 差值图
查看建议报告,如下图所示:
图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% |