标签:
最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题。这里写一篇文章,总结一下这几类问题,以及其对应的解决方案。方便其它项目组参考。
常见问题一:打开页面非常慢,有的项目打开一个页面竟然要 20 多秒。
优化步骤:
常见问题二:单条 SQL 语句执行较慢
在数据量较大的情况下,一些 SQL 语句执行得非常慢。
优化步骤:
例如,下面这个 SQL,在压力测试 1000 万行数据时,已经需要 8 秒左右:
SELECT * FROM ( SELECT T.*, ROWNUM RN FROM ( SELECT * FROM "T_PRIMITIVEDETAIL" "T0" WHERE "T0"."ORDERGOODSDATE" >= :p0 AND "T0"."ORDERGOODSDATE" <= :p1 AND "T0"."CORPORATION" = :p2 AND "T0"."DBI_ISPHANTOM" = :p3 ORDER BY "T0"."ID" ASC ) T WHERE ROWNUM <= 5000010 ) WHERE RN >= 5000000 --Parameters:2016/5/1 0:00:00,2016/5/31 23:59:59,"惠州酷友网络科技有限公司","0"
ID 列和 ORDERGOODSDATE 列都是建立了索引的,同时也为 ORDERGOODSDATE 列建立了表分区。经过几次测试,发现通过索引列排序进行查询速度还是较慢(索引 Id 列:首次5秒,后面都是2.3秒;有索引的时间列:6秒;不排序:2秒)。
同时,我们还对分页 SQL 进行的测试。目前有三种较为通用的分页格式:
1.根据ROWID来分
select * from t_xiaoxi where rowid in(
select rid from (
select rownum rn,rid from(
select rowid rid,cid from
t_xiaoxi order by cid desc
) where rownum<10000
) where rn>9980
)
order by cid desc;
2.按分析函数来分
select * from (
select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t
) where rk<10000 and rk>9980;
3.按ROWNUM来分
select * from(
select t.*,rownum rn from(
select * from t_xiaoxi order by cid desc
) t where rownum<10000
) where rn>9980;
结果发现,原来的分页格式,效率是最高的。下面的 SQL 查询需要 4 秒:
select * from (
select t.*,row_number() over(order by id ASC) rk from T_ENTERPRISETRANSACTION t
) where rk <= 5000010 and rk >= 5000000
由于我们的分页 SQL 是自动生成的,所以格式方面我们要保留一定的通用性,同时性能不能太差。所以还是决定继续保留原有的格式。
前面几个优化方案没有成功。我们就看了一下测试人员插入的一千条数据。原来这些数据的时间都是同一天的!!!造成了分区和索引失效。将数据按照真实场景录入后,不到 1s 就查询出来了。
另外,第 6 条:有 50 万页数据的页面,不应该设计给客户看到。所以我让项目组的同这考虑是否需要删除这个页面,换一种实现方案。
第8条,不查全字段,只查 ID:测试后,也有了比较明显的效果。
SELECT ID FROM ( SELECT T.*, ROWNUM RN FROM ( SELECT ID FROM "T_ENTERPRISETRANSACTION" "T0" --order by T0.Id desc --order by T0.DBI_CreatedTime --order by T0.tradeDate ) T WHERE ROWNUM <= 5000010 ) WHERE RN >= 5000000 --0.6秒 SELECT * FROM "T_ENTERPRISETRANSACTION" "T0" WHERE ID IN (7853679,7853680,7853681,7853682,7853683,7853684,7853685,7853686,7853687,7853688,7853689) --0.1秒
一共只需要 0.7 秒。
常见问题三:大数据导入性能优化
公司产品的一个重要模块是一个数据导入引擎。基于 WF4 引擎,配合一定的活动,来实现从文件到数据库的导入。即:读取文件 –> 大量数据格式转换逻辑 & 大量业务逻辑 –> 导入数据库。
由于逻辑非常复杂,所以我们并没有把这些逻辑放到数据库中去编写存储过程,而是基于内存中的领域实体来执行业务逻辑。
对于此程序的优化步骤:
小结
本文对公司几个项目遇到的共性问题进行了总结。
希望能对其它的项目组有所帮助。也希望能收集到更多的优化建议。
标签:
原文地址:http://www.cnblogs.com/zgynhqf/p/5609147.html