最近网站的访问太慢,主要原因有以下三点:
- 数据库设计不合理,关联表太多造成查询速度慢
- 数据库视图嵌套太多直接影响性能
- 数据库索引除主键索引外几乎没有
- ORM映射框架没有缓存机制,利用反射
- 通用查询存储过程性能问题
- Controller层的代码编写效率低下,需要重构
- View层异步操作太多
总结了以上几点后,决定花时间彻底清查旧账进行数据到表示层的重构,首先从数据库下手,利用SQL Server的Profile工具对现有数据库操作的监控,并利用SQL Server优化引擎对监控结果进行了分析,分析结果如下:
1.工作负荷分析报告:
语句类型 | 语句数 | 开销降低 | 开销增加 | 未更改 |
Select | 833 | 449 | 1 | 383 |
Update | 55 | 3 | 3 | 49 |
Insert | 395 | 303 | 34 | 58 |
通过上述统计可以看出大部分还是查询的操作比较多,至于Insert也是因为通用查询存储过程中利用Insert INTO表变量进行了分页造成的,现在的瓶颈应该基本集中在查询存储过程以及表间关系复杂度上,造成left JOIN和Inner JOIN 特别是UNION ALL 表以及视图的联合更加耗费资源和性能,因此利用数据引擎优化工具,分析后的索引方案创建了部分索引以及索引统计,提高了查询性能并不是很明显。
2009-07-18 调整数据库中表的关系,尽量去除表间关系,减少不必要的多表查询操作
1.论坛表结构调整:
目前,论坛速度慢的主要原因是因为利用视图联合了信息内容和论坛本身的帖子导致查询速度慢,具体表关系如下图:
可见,Tang_BBSInfo表的设计不符合数据库范式:一个字段只有一种含义。InformationID同时存储了3个表的
Id,需求是图片信息的标题和描述 视频信息的标题和描述 新闻信息的标题和内容都要作为帖子发布到论坛,同时整站在上述三处发布评论,都作为论坛该帖子的回复显示到论坛,根据这个需求设计的表结构如下:
Title | Note | InformationID | ModuleID |
论坛帖子 | 帖子内容 | 0 | 50(论坛) |
NULL | NULL | 123002 | 52(图片) |
NULL | NULL | 2323 | 53(视频) |
NULL | NULL | 232322 | 9(新闻) |
可见title和note来源非论坛的都为NULL值,完全凭借InformationID+ModuleID来区别是来自图片、视频还是新闻,这样查询论坛帖子的时候需要UNION 3个表的数据,特别是UNION严重影响性能,目前信息才几百条就已经显示超时了。
更新Tang_bbsInfo的帖子标题和内容为信息的标题和内容,就不用再关联信息表(数据量大的表)这样就可以减少查询时间,另外页面上显示直接查询Tang_BbsInfo表即可