提升快车数据获取性能建议解决方案
一般性数据性能提升途经
1.连接
提升方式:
- 使用数据连接池,异步连接
- 使用语句分析工具进行查询语句分析,调整语法以提高索引利用程度.
- 尽量避免每次返回大量结果集
2.索引
改善方式:
针对表连接建立索引
3.数据缓存
- 调整数据缓存大小,提升缓存命中率
- 将热点表放入keep buffer cache, 防止其被挤出default pool 。从而减少physical read所带来的I/O开销。
- 使用Result Cache进行结果集缓存
快车获取数据解决方案分析
程序现状
- 每十秒根据发布时间得到最新的最多两百条数据
- 货物信息状态可能会随时发生变更,状态由0变成1,发布时间变更为当前时间.
- 使用EJB直接操作,获取数据,继而向客户端返回数据请求,未使用连接池,数据缓存.
数据库现状(非确定)
- 针对表连接做了唯一索引(即主外键关联)
- 库缓存性能情况:
NAMESPACE |
PINS |
PINHITS |
RELOADS |
INVALIDATIONS |
PINHITRATIO |
SQL AREA |
119389 |
116961 |
22 |
0 |
97.9663118042701 |
TABLE/PROCEDURE |
201813 |
200076 |
1 |
0 |
99.1393022253274 |
BODY |
47 |
39 |
0 |
0 |
82.9787234042553 |
TRIGGER |
695 |
693 |
0 |
0 |
99.7122302158273 |
INDEX |
31 |
0 |
0 |
0 |
0 |
CLUSTER |
668 |
657 |
0 |
0 |
98.3532934131737 |
OBJECT |
0 |
0 |
0 |
0 |
100 |
PIPE |
0 |
0 |
0 |
0 |
100 |
JAVA SOURCE |
0 |
0 |
0 |
0 |
100 |
JAVA RESOURCE |
2 |
1 |
0 |
0 |
50 |
JAVA DATA |
6 |
4 |
0 |
0 |
66.6666666666667 |
PINS |
PINHITS |
RELOADS |
INVALIDATIONS |
REPARSING |
329089 |
324844 |
23 |
0 |
1.28992461005989 |
命中率到了接近99%,但是由于数据库是开发测试用,具体使用性能不能作准
共享池大小:
POOL SIZE
shared pool 125829120
改善建议
- 针对十秒内获取的两百条数据在EJB端进行缓存,返回给客户端的即EJB上存储的数据,而非每次即时的向数据获取
- 在货物信息表状态列建立位图索引,在发布时间上建立索引,提升筛选速度.
- 建立数据连接池,减少创建Connection消耗.
- 更改读写同步的请求方式,以提升查询速度.
想要完全避免是不可能的,主要还是避免频繁查询数据库,尽量将数据缓存在程序端,这样就能尽可能的避免等待资源
- 将查询的热点表(KC_INFO)加入到keep buffer,减少物理读取过程.
- 在客户端提交变更请求并执行后,非必要应避免commit,这样避免频繁写入I/O,与数据读取竞争资源,oracle优先于写入.