MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)
最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题。这里写一篇文章,总结一下这几类问题,以及其对应的解决方案。方便其它项目组参考。
常见问题一:打开页面非常慢,有的项目打开一个页面竟然要 20 多秒。
优化步骤:
- 降低每一个页面的请求数:使用浏览器跟踪打开页面后所有的请求,并逐一排查,把没有必要向服务端发起的请求优化掉,减少 Round Trip 次数。
- 针对每一个请求进行优化:对请求逐一排查,看看分别是哪些请求占用了较多的时间。
如果该请求是 JS 文件,则考虑使用压缩版本(例如正在使用的 EXTJS,应该使用 ext-all.js 1.9M,而不是 ext-all-debug.js 4.5M)。
静态资源要尽量启用缓存。 - 将每次请求所对应的数据库访问次数降低到最低:这一步属于后端优化。
每一个请求到达服务端后,都会做一系列的操作,例如:初始化当前用户、角色、权限、当前模块、业务逻辑、日志等。
对于前四个操作,往往是所有页面都需要初始化的,那么我们需要使用 Session 或 Cache 等技术来优化,以防止每次请求都重新访问数据库。
对于业务逻辑、日志等,我们主要解决的是《ORM 中的 N+1 问题》、优化掉多余的数据库访问(需要记住,每一次数据库访问,其实都是一次远程访问)。 - 另外,Web 页面的前端优化,还可以参考《 YAHOO Web 优化的 14 条法则》。
常见问题二:单条 SQL 语句执行较慢
在数据量较大的情况下,一些 SQL 语句执行得非常慢。
优化步骤:
- 是否 SQL 本身有性能问题?
- 是否建立了表分区?
http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html
http://blog.csdn.net/hijiankang/article/details/9173877 - 是否对主要查询的字段建立了索引?
- 测试数据是否有效?(尽量按照真实场景来准备测试数据)
- 是否需要限制用户的数据查询范围?
- 是否需要优化业务结构?
是否真的需要为用户提供一个查看几十万页的数据的页面?这样的数据对于用户来说,往往是没用的。我们应该在功能模块方面重新设计? - 不要使用 JOIN,而是使用 IN 语句。
- 不要查询全字段,而是只查询 ID。
例如,下面这个 SQL,在压力测试 1000 万行数据时,已经需要 8 秒左右:
SELECT * FROM
(SELECT T.*, ROWNUM RNFROM (
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) TWHERE 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 RNFROM (
SELECT ID
FROM "T_ENTERPRISETRANSACTION" "T0"
--order by T0.Id desc
--order by T0.DBI_CreatedTime
--order by T0.tradeDate) TWHERE 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 引擎,配合一定的活动,来实现从文件到数据库的导入。即:读取文件 –> 大量数据格式转换逻辑 & 大量业务逻辑 –> 导入数据库。
由于逻辑非常复杂,所以我们并没有把这些逻辑放到数据库中去编写存储过程,而是基于内存中的领域实体来执行业务逻辑。
对于此程序的优化步骤:
- 通过性能监控工具,找到性能损耗的核心位置,再针对该位置出方案进行优化。
这一步应该作为第一个步骤。开发者在对性能进行优化时,往往出现“想当然”地去分析、优化的行为,最终是花费了时间也没有优化到点上!所以这里首重提出这一步骤。先让工具去帮我们找到这些核心位置! - 降低数据库访问次数。(此项检查是所有数据库访问程序的首要优化方案,也是最容易出现问题的地方)。
1.1 解决 ORM 中的 N+1 问题。
1.2 在内存中一次性准备好数据后,再插入到数据库中。
1.3 对于导入大数据量到数据库中,采用批量导入方案,而非逐条导入方案。 - 多线程技术。
由于数据导入程序是 IO 密集型 + CPU 密集型操作,但是二者的运行阶段不同。所以合理地采用多线程,可以大大提升执行效率。
使用多线程时,要注意线程安全的问题:尽量不要有太多的共享资源(文件、数据库中的行);共享资源要加锁(文件加锁、内存加锁、数据库事务(事务的级别))。
另外,提前为各个线程准备好一些共用的数据,也可以优化一些不必要的 IO。 - 优化核心大数据的循环,以及嵌套循环的核心循环中的代码即可。这些位置的代码,需要处处小心,优化到极致。
核心循环中,不要用 LINQ To Object:一个 Linq To Object 操作,至少生成了三个轻量级对象:一个委托、一个实现 IEnumerable 接口的对象,以及遍历集合时,生成的一个 Enumerator。
核心循环中,要尽量减少循环的次数。例如:1000万数据和100万数据做循环匹配,不优化的循环就需要执行 1000万*100万次。所以我们需要引入一些算法来优化不必要的循环次数。
只需要优化核心循环,不需要优化所有的代码。LINQ To Object 该用的时候,还要用。
小结
本文对公司几个项目遇到的共性问题进行了总结。
希望能对其它的项目组有所帮助。也希望能收集到更多的优化建议。
转载于:https://www.cnblogs.com/zgynhqf/p/5609147.html
MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)相关推荐
- aso优化师是什么_2019最新ASO优化常见问题精选(下)
专注ASO优化,运营课堂,APP运营推广,行业资讯. 德普优化,必备ASO数据分析平台! 首页 » ASO优化 » 2019最新ASO优化常见问题精选(下) 2019最新ASO优化常见问题精选(下) ...
- 性能调优常见问题与方案
最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题.这里写一篇文章,总结一下这几类问题,以及其对应的解决方案.方便其它项目组参考. 常见问题一:打开页面非常慢,有的项 ...
- 前端性能优化的重要方案:图片懒加载
大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...
- Android 系统性能优化(52)---移动端性能监控方案Hertz
移动端性能监控方案Hertz 性能问题是造成App用户流失的罪魁祸首之一.App的性能问题包括崩溃.网络请求错误或超时.响应速度慢.列表滚动卡顿.流量大.耗电等等.而导致App性能低下的原因有很多,除 ...
- NEON优化:性能优化常见问题QA
NEON优化:性能优化常见问题QA NEON优化系列文章: NEON优化1:软件性能优化.降功耗怎么搞?link NEON优化2:ARM优化高频指令总结, link NEON优化3:矩阵转置的指令优化 ...
- 宝塔php并发500什么意思,宝塔bt面板服务器设置调整PHP最大并发性能优化设置方法方案...
这篇文章主要为大家详细介绍了宝塔bt面板服务器设置调整PHP最大并发性能优化设置方法方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 今天要给大家介绍的是宝塔 ...
- 大型网站性能监测、分析与优化常见问题QA
@tanwen110 (唐文),曾负责腾讯四大平台之一网络媒体平台的整体运维.运营规划工作:曾任百度T7架构师和百度性能优化TOPIC.百度UAQ.APM平台负责人:畅销书<海量运维.运营规划之 ...
- Layabox谢成鸿出席TFC,公布智能优化方案可提升性能2倍!
2017第十五届TFC首度移师厦门,Layabox创始人谢成鸿应邀参加了由TFC与5玩游戏主办的第六届HTML5游戏高峰论坛,并以"做最好的游戏技术提供商"为主题进行了分享. La ...
- SystemML大规模机器学习,优化算子融合方案的研究
SystemML大规模机器学习,优化算子融合方案的研究 摘要 许多大规模机器学习(ML)系统允许通过线性代数程序指定定制的ML算法,然后自动生成有效的执行计划.在这种情况下,优化的机会融合基本算子的熔 ...
最新文章
- linux系统主要常见目录结构
- Web PostMessage
- 阿里日马云开启直播首秀,谈年轻人压力大:一句话给“骂”醒了!
- Uniswap 24h交易量约为10.6亿美元涨2.91%
- uiautomator使用中文参数
- 如何画好一套线性图标
- python实现推荐系统(一)
- 衬线字体与非衬线字体
- msvcp140.dll是什么?丢失了msvcp140.dll要如何修复?
- Linux命令之大文件分割
- sketch插件 android,Sketch 插件大集合
- java五子棋的重要算法讲解_[Java五子棋小游戏-Ai算法精讲以及实现]-02--高级算法初步...
- 哈工大 计算机系统 一纸开卷CSAPP
- linux 安装Docker
- 野火 步进电机 视频笔记
- 论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》
- “COMSOL Multiphysics多物理场仿真技术与应用” 电化学专题
- 解决shapes (none,111) and (none,111) are incompatible
- 白葡萄酒/红葡萄酒质量分析与预测(PCA+MLPClassifier)100%
- 先做接口测试还是功能测试
热门文章
- tkinter绑定鼠标滚轮滚动事件
- oracle12c多个pdb,Oracle 12c 多租户专题|12cR2中PDB内存资源管理
- JavaScript为什么使用原型模式而不是类模式
- 韩文版ie8 启用java_只有在启用了javascript的情况下,IE8才会在IE8模式下重新加载崩溃...
- vue工程本地代码请求http发生跨域提示错误解决方法
- 手动设计简单的Token验证
- Mistakes(Updating)
- MySQL -A不预读数据库信息(use dbname 更快)
- 关于重构之Switch的处理【一】如果是有序的话,如何处理
- UA OPTI512R 傅立叶光学导论3 用复变函数表示物理量