上周五,在现场处理一个web页面缓慢的问题,主要功能是显示非常多的统计数据,画出很多图表。听说是新加了一个功能块后,页面变的很慢,于是我先建议关闭新加的功能,后来还是很慢;于是建议分块关闭页面上的功能。策略是先按大块找问题出现的地方,再进入块找细节问题,类似2分法,当然也可以先关闭一半页面功能。慢慢变的快了一点,最后全关了,才秒出。
看来不仅是局部问题了,我开始仔细分析代码,页面上的功能主要就是各种各样的查询SQL语句,用的是Oracle,主要问题有以下方面:
1.很多统计的查询条件是 id like '____SH' and name like '%上海%'
了解下来,这是一个类型的的数据,但是并没有单独的类型字段,后期只能用这样的条件来区分出来。
所以问题的根源是:数据字段设计缺失,应该设计特有的类型字段;这两个字段都无法利用上索引来提高查询速度。因为不确定的部分在前面,如果是'上海%'还有可能。
解决方法是:instr的效率在有索引的情况下应该高于like,把前者用subStr截取后='SH',后者用instr>0的方法,几乎没有明显的提高。另一终极处理就是新建类型字段,一次性处理历史数据,新数据可以完善前台功能,或者数据库上建触发器,新增数据时按条件置类型字段,新字段上当然建好索引。
2.很多统计的主外键关联是trim(pk)=trim(id)
了解下来,因为有些数据是其它地方交换过来的,提供的数据不规范,前后可能有空格,造成查不到需要的数据。
所以问题是:规范提供的数据,入库的数据一定要是标准的。外键上的索引也用不上,因为带有函数,总不至于都建函数索引吧。
解决方案:一方面查找历史数据,也许只是个别地方提供的数据有问题,要求修改。当然可以先处理老数据,再用触发器来预处理新数据,但这绝不好办法。
3.有一个统计是按提前,正常,超期分类得到各自数据,总数又用了一个sql去算,为何不直接把三个分类数据加起来呢?
还发现一个重要的业务ID用了distinct,我问这个会有重复吗?一查字段是主键。
还发现三个数据,都有一个完成的字段判断,写在每类的case when里面,为何不写在查询外面的where条件里呢?既然都有这个case when的条件?
4.发现所有的统计是从年初到当天,而每一个sql语句里都有sysDate转日期。
通常我们页面呈现的数据是有一个日期范围的,或者当月,或者一个月内,根据业务与数据情况而定,不可能没有限制。我们查询股票交易都有很严格的时间限制,数据实在是太多了,历史数据也要求开始与结束不通过比如1个月。
例子是极端的情况,但当年的数据,也许后面太多会计算很慢,要考虑一下。当然这个sql中的今日,为何不能在外面算好,统一为常量传给数据库计算?而现在每个SQL都要再算一下。
因为数据的日期精确到时分秒,所以我考虑是不是做一个日期的函数索引?只到天,这样在条件中也使用日期函数,也许会快一点。
5.一个数据表的查询条件一样,但有和不同其它表的关联统计,目前是一个个独立的SQL,是否考虑把这些都join在一起,一个语句中返回结果,可以合并一些查询SQL。因为使用连接池,也许效果不太明显。我的习惯是用一条SQL搞定数据,而不要返回后再各种处理,充分利用数据库的功能。
6.页面中的统计太多了,局部加载也是一个方案,当鼠标拉下来的时候,再进行查询展示屏幕后部分功能。
7.脚本后置,异步获取数据,先让页面主体结构出来也是一个方案。
8.提前缓存查询结果也是一个策略,考虑到数据实时性要求不高时,可以提前在后台计算出数据。唯独注意系统启动时必须计算一次,否则没数据就尴尬了。
9.其它情况,完全处理好后再补充,欢迎交流各种心得。
不过太关注细节是没前途的,呵呵~
分享到:
相关推荐
在Web开发中,登录页面和后台管理页面是网站的核心组成部分,它们确保了用户的安全性和管理员的有效控制。这个压缩包提供的是静态HTML源码文件,意味着它们不包含服务器端的脚本,如PHP、Java或ASP.NET,而是由...
在Web开发中,将用户上传的Excel文件读取并保存到数据库是一项常见的需求。这个项目实现了这个功能,提供了从头到尾的完整代码,对于学习和应用都非常有帮助。下面我们将详细探讨涉及的知识点。 首先,我们需要理解...
在IT领域,Web页面打开外部EXE程序是一个常见的需求,特别是在提供特定客户端服务或与桌面应用集成时。这种技术主要用于创建交互式用户体验,比如网页上的QQ客服功能,用户可以直接从浏览器启动应用程序,无需离开...
在“大学新手做的WEB页面设计 适合作为作业”这个项目中,我们可以探索一系列与Web页面设计相关的基础知识,这些知识对于初学者来说至关重要。Web页面设计是计算机科学和信息技术领域中的一个关键部分,特别是对于...
这种技术基于Office Web Components(OWC),这是一个由微软开发的组件集,用于在Web浏览器中展示和操作Office文档,包括Excel。下面将详细解释如何实现这一功能,以及涉及的关键知识点。 首先,我们要理解`classid...
本知识点主要探讨如何实现一个Web页面,允许用户上传CSV文件,并进行相关的处理。 首先,我们需要在Web页面上创建一个文件输入元素,让用户选择CSV文件。这通常通过HTML5的`<input type="file">`标签实现。例如: ...
在IT行业中,大华OCX插件是一种专为嵌入Web页面设计的控件,用于实现与大华摄像头的交互。这种插件的核心功能是使Web应用能够无缝调用大华摄像头的视频采集和控制能力,尤其适用于需要实时监控或者视频会议等应用...
在Web开发中,emoji表情已经成为用户交流不可或缺的一部分,特别是在社交网络和聊天应用中。iOS和Android设备用户在输入时会使用各自平台特定的emoji表情符号,这些符号在不同的操作系统和浏览器上可能显示不一致,...
ASP.NET Web 页面中的电子称串口控件是用于在网页上与硬件设备,如电子称进行通信的一种技术。这种控件通常使用ActiveX技术,允许客户端浏览器与串口设备交互,实现数据的读取和控制。本文将详细介绍如何在ASP.NET...
"好看的web登录页面"这一主题涵盖了多个方面的设计原则和技术要点。 首先,从视觉设计的角度来看,"好看"意味着页面需要有吸引人的布局和色彩搭配。设计师通常会选择清晰的背景图像或者简洁的纯色,以营造舒适和谐...
在Web页面设计中,进度条是一个非常常见的交互元素,它能提供给用户关于操作状态的实时反馈,如数据加载、文件上传或下载等过程的进度。实现Web页面中的进度条,通常涉及到HTML、CSS和JavaScript这三种技术的结合。...
web页面上的雷达图,使用javascript+svg生成。 支持firefox chrome safari 更多功能查看 http://blog.csdn.net/babyding/article/details/7776452
在Web开发中,动态绘制流程图是一项常见的需求,特别是在数据可视化、项目管理或者系统设计等领域。Raphael.js是一个强大的JavaScript库,专用于在浏览器中创建SVG(可缩放矢量图形)和VML(Vector Markup Language...
phpweb二次开发,phpweb破解版,phpweb后台升级,phpweb2.0.5升级,phpweb成品网站商业版v1.5.0/20111209升级包 phpweb成品网站升级包免费送给爱好phpweb成品网站朋友,已经更新到最新的v2.0.5/20120412 免责声明:此...
在本文中,我们将探讨如何利用STM32F407微控制器和LWIP(Lightweight IP)库来搭建一个简单的Web服务器,并通过LAN9303以太网控制器连接网络。 首先,LWIP是一个开源、轻量级的TCP/IP协议栈,适用于资源有限的...
在本文中,我们将深入探讨如何使用C#语言实现一个简单的Web打印控件。Web打印控件对于Web应用程序来说是至关重要的,它允许用户在浏览器环境中直接打印网页内容,而无需通过复制粘贴到其他应用程序中。传统的Web打印...
在构建Web页面聊天窗口时,HTML、CSS和JavaScript是三个至关重要的技术,它们共同作用于创建一个用户友好、直观且功能丰富的交互式界面。在这个场景中,“web页面聊天窗口的html、css、js,界面简单清晰”指的是使用...
在本主题"非常漂亮的类Web界面的Delphi设计"中,我们将深入探讨如何利用Delphi来创建类似Web页面的美观用户界面。这种设计风格不仅能够提供用户熟悉的交互体验,还能提升应用程序的整体视觉吸引力。 首先,Delphi中...
总结,"海康摄像头web的demo 完整源码"是一个用于开发海康摄像头web应用的重要工具,它涵盖了摄像头控制、视频流处理、Web API调用等多个关键领域。借助这个开发包,开发者可以更便捷地将海康摄像头的功能集成到自己...
这里的`/error/404.jsp`和`/error/500.jsp`是放置在Web应用根目录下的错误处理JSP页面。 404页面模板的设计应该简洁、易懂且具有引导性。它应包含以下元素: 1. 清晰的错误消息:明确告诉用户发生了404错误。 2. ...