最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题。这里写一篇文章,总结一下这几类问题,以及其对应的解决方案。方便其它项目组参考。

常见问题一:打开页面非常慢,有的项目打开一个页面竟然要 20 多秒。


优化步骤:

  1. 降低每一个页面的请求数:使用浏览器跟踪打开页面后所有的请求,并逐一排查,把没有必要向服务端发起的请求优化掉,减少 Round Trip 次数。
  2. 针对每一个请求进行优化:对请求逐一排查,看看分别是哪些请求占用了较多的时间。
    如果该请求是 JS 文件,则考虑使用压缩版本(例如正在使用的 EXTJS,应该使用 ext-all.js 1.9M,而不是 ext-all-debug.js 4.5M)。
    静态资源要尽量启用缓存。
  3. 将每次请求所对应的数据库访问次数降低到最低:这一步属于后端优化。
    每一个请求到达服务端后,都会做一系列的操作,例如:初始化当前用户、角色、权限、当前模块、业务逻辑、日志等。
    对于前四个操作,往往是所有页面都需要初始化的,那么我们需要使用 Session 或 Cache 等技术来优化,以防止每次请求都重新访问数据库。
    对于业务逻辑、日志等,我们主要解决的是《ORM 中的 N+1 问题》、优化掉多余的数据库访问(需要记住,每一次数据库访问,其实都是一次远程访问)。
  4. 另外,Web 页面的前端优化,还可以参考《 YAHOO Web 优化的 14 条法则》。

常见问题二:单条 SQL 语句执行较慢


在数据量较大的情况下,一些 SQL 语句执行得非常慢。

优化步骤:

  1. 是否 SQL 本身有性能问题?
  2. 是否建立了表分区?
    http://www.cnblogs.com/leiOOlei/archive/2012/06/08/2541306.html
    http://blog.csdn.net/hijiankang/article/details/9173877
  3. 是否对主要查询的字段建立了索引?
  4. 测试数据是否有效?(尽量按照真实场景来准备测试数据)
  5. 是否需要限制用户的数据查询范围?
  6. 是否需要优化业务结构?
    是否真的需要为用户提供一个查看几十万页的数据的页面?这样的数据对于用户来说,往往是没用的。我们应该在功能模块方面重新设计?
  7. 不要使用 JOIN,而是使用 IN 语句。
  8. 不要查询全字段,而是只查询 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. 通过性能监控工具,找到性能损耗的核心位置,再针对该位置出方案进行优化。
    这一步应该作为第一个步骤。开发者在对性能进行优化时,往往出现“想当然”地去分析、优化的行为,最终是花费了时间也没有优化到点上!所以这里首重提出这一步骤。先让工具去帮我们找到这些核心位置!
  2. 降低数据库访问次数。(此项检查是所有数据库访问程序的首要优化方案,也是最容易出现问题的地方)。
    1.1 解决 ORM 中的 N+1 问题。
    1.2 在内存中一次性准备好数据后,再插入到数据库中。
    1.3 对于导入大数据量到数据库中,采用批量导入方案,而非逐条导入方案。
  3. 多线程技术。
    由于数据导入程序是 IO 密集型 + CPU 密集型操作,但是二者的运行阶段不同。所以合理地采用多线程,可以大大提升执行效率。
    使用多线程时,要注意线程安全的问题:尽量不要有太多的共享资源(文件、数据库中的行);共享资源要加锁(文件加锁、内存加锁、数据库事务(事务的级别))。
    另外,提前为各个线程准备好一些共用的数据,也可以优化一些不必要的 IO。
  4. 优化核心大数据的循环,以及嵌套循环的核心循环中的代码即可。这些位置的代码,需要处处小心,优化到极致。
    核心循环中,不要用 LINQ To Object:一个 Linq To Object 操作,至少生成了三个轻量级对象:一个委托、一个实现 IEnumerable 接口的对象,以及遍历集合时,生成的一个 Enumerator。
    核心循环中,要尽量减少循环的次数。例如:1000万数据和100万数据做循环匹配,不优化的循环就需要执行 1000万*100万次。所以我们需要引入一些算法来优化不必要的循环次数。
    只需要优化核心循环,不需要优化所有的代码。LINQ To Object 该用的时候,还要用。

小结


本文对公司几个项目遇到的共性问题进行了总结。

希望能对其它的项目组有所帮助。也希望能收集到更多的优化建议。

转载于:https://www.cnblogs.com/zgynhqf/p/5609147.html

MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)相关推荐

  1. aso优化师是什么_2019最新ASO优化常见问题精选(下)

    专注ASO优化,运营课堂,APP运营推广,行业资讯. 德普优化,必备ASO数据分析平台! 首页 » ASO优化 » 2019最新ASO优化常见问题精选(下) 2019最新ASO优化常见问题精选(下) ...

  2. 性能调优常见问题与方案

    最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题.这里写一篇文章,总结一下这几类问题,以及其对应的解决方案.方便其它项目组参考. 常见问题一:打开页面非常慢,有的项 ...

  3. 前端性能优化的重要方案:图片懒加载

    大家好,我是前端岚枫,一枚二线城市的程序媛,今天主要跟大家分享我整理的前端性能优化的重要方案:图片懒加载,主要包括其原理,我们常用的一些插件,及编写源码实现图片懒加载功能等,图片懒加载是项目比较常见的 ...

  4. Android 系统性能优化(52)---移动端性能监控方案Hertz

    移动端性能监控方案Hertz 性能问题是造成App用户流失的罪魁祸首之一.App的性能问题包括崩溃.网络请求错误或超时.响应速度慢.列表滚动卡顿.流量大.耗电等等.而导致App性能低下的原因有很多,除 ...

  5. NEON优化:性能优化常见问题QA

    NEON优化:性能优化常见问题QA NEON优化系列文章: NEON优化1:软件性能优化.降功耗怎么搞?link NEON优化2:ARM优化高频指令总结, link NEON优化3:矩阵转置的指令优化 ...

  6. 宝塔php并发500什么意思,宝塔bt面板服务器设置调整PHP最大并发性能优化设置方法方案...

    这篇文章主要为大家详细介绍了宝塔bt面板服务器设置调整PHP最大并发性能优化设置方法方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 今天要给大家介绍的是宝塔 ...

  7. 大型网站性能监测、分析与优化常见问题QA

    @tanwen110 (唐文),曾负责腾讯四大平台之一网络媒体平台的整体运维.运营规划工作:曾任百度T7架构师和百度性能优化TOPIC.百度UAQ.APM平台负责人:畅销书<海量运维.运营规划之 ...

  8. Layabox谢成鸿出席TFC,公布智能优化方案可提升性能2倍!

    2017第十五届TFC首度移师厦门,Layabox创始人谢成鸿应邀参加了由TFC与5玩游戏主办的第六届HTML5游戏高峰论坛,并以"做最好的游戏技术提供商"为主题进行了分享. La ...

  9. SystemML大规模机器学习,优化算子融合方案的研究

    SystemML大规模机器学习,优化算子融合方案的研究 摘要 许多大规模机器学习(ML)系统允许通过线性代数程序指定定制的ML算法,然后自动生成有效的执行计划.在这种情况下,优化的机会融合基本算子的熔 ...

最新文章

  1. linux系统主要常见目录结构
  2. Web PostMessage
  3. 阿里日马云开启直播首秀,谈年轻人压力大:一句话给“骂”醒了!
  4. Uniswap 24h交易量约为10.6亿美元涨2.91%
  5. uiautomator使用中文参数
  6. 如何画好一套线性图标
  7. python实现推荐系统(一)
  8. 衬线字体与非衬线字体
  9. msvcp140.dll是什么?丢失了msvcp140.dll要如何修复?
  10. Linux命令之大文件分割
  11. sketch插件 android,Sketch 插件大集合
  12. java五子棋的重要算法讲解_[Java五子棋小游戏-Ai算法精讲以及实现]-02--高级算法初步...
  13. 哈工大 计算机系统 一纸开卷CSAPP
  14. linux 安装Docker
  15. 野火 步进电机 视频笔记
  16. 论文解读二代GCN《Convolutional Neural Networks on Graphs with Fast Localized Spectral Filtering》
  17. “COMSOL Multiphysics多物理场仿真技术与应用” 电化学专题
  18. 解决shapes (none,111) and (none,111) are incompatible
  19. 白葡萄酒/红葡萄酒质量分析与预测(PCA+MLPClassifier)100%
  20. 先做接口测试还是功能测试

热门文章

  1. tkinter绑定鼠标滚轮滚动事件
  2. oracle12c多个pdb,Oracle 12c 多租户专题|12cR2中PDB内存资源管理
  3. JavaScript为什么使用原型模式而不是类模式
  4. 韩文版ie8 启用java_只有在启用了javascript的情况下,IE8才会在IE8模式下重新加载崩溃...
  5. vue工程本地代码请求http发生跨域提示错误解决方法
  6. 手动设计简单的Token验证
  7. Mistakes(Updating)
  8. MySQL -A不预读数据库信息(use dbname 更快)
  9. 关于重构之Switch的处理【一】如果是有序的话,如何处理
  10. UA OPTI512R 傅立叶光学导论3 用复变函数表示物理量