单车男

每天进步一点点,积累下来就不得了...
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

DRP性能优化总结会收获

Posted on 2012-05-22 22:57  单车男  阅读(466)  评论(3编辑  收藏  举报

今上午公司技术研究部(TRD)对我们系统进行了评测性能报告,指出了其中的不足和改善的方案,现选取部分总结如下:

 1. C#事务处理没有加Try , catch:

问题描述:C#端的事务控制需要和try catch配套使用,否则出现异常后无法处理回滚。

 

2. 表结构处理

问题描述:VIP表增加一个InfoDate日期字段,内容为:’9999-客户生日月-客户生日’。同时,在该列上创建非聚集索引。
   添加该列是为了解决VIP表的查询中存在的大量的对BirthDay列的函数处理。
   Where条件中对列使用函数会导致索引失效,导致查询变慢

 

 

3.Left Join和子查询的关联顺序问题

问题描述:该类处理sql拼接时,是先在单据表上关联了很多的基本信息表后,再做的分页,这种处理会导致大量的IO浪费。

例如:BillListDS1.cs

建议:先做子查询分页再进行left join ,将结果集缩小到最小,效率更优

 

4. UNION的滥用

问题描述:不需要消除重复记录的情况下使用了UNION,UNION 比UNION ALL多了一个去重的功能,在大数据量的时候更消耗性能
解决:改成UNION ALL

 

5. 取总行数的方法问题

错误方式一:取总的记录数,但却执行了不必要的left join,order by,获取了不必要的行号信息。
 问题出现频度:大量的DoSum方法都有问题

例如:

错误方式二:没有用count(*),而是取出所有记录,再使用 @@recordcount

 

6. 低效的一步完成的SQL

问题描述:把应该多步走的sql放到了一起,这种拆分思路更加明确,代码更易维护,另外执行效率也大幅提升
解决:分成多步
例如:单据装箱配置(BillPack_Config)

建议:分成两步

 

7. 表变量的滥用

问题描述:大量使用表变量,导致数据量大时的慢查询
解决:在不明确可能插入的记录数量级时,不要使用表变量,最好使用临时表代替表变量,因临时表存放在tempDB,物理表关联更快
例如:存储过程pGetYKDetailsList

 

8.可以使用Merge语句

问题描述:存在修改,否则新增的语句可以改用Merge语句实现
例如:BillCheckOut方法中对AgtStoAdjBill表操作的部分

 

9.多余的事务

问题说明:事务也是有消耗的,单独的一句delete/update操作不需要加事务
使用频度:很多单据相关类的BillDelete/BillAudit方法都在这样使用
例如:

 

10. 多余的嵌套事务

问题说明:sql语句中已经带了事务,C#代码中就不要再用事务包裹了
例如:BillService_QT273的BillAudit方法

 

 

11. 多余的Hint问题

  nolock提示符
问题描述:使用了可能导致脏读的nolock提示符
解决办法:使用快照隔离,去掉nolock提示

 

 nowait提示符
问题描述:Select时使用了无效的提示符
解决办法:去掉nowait

 

12. 堆状的充满多余语句的SQL

问题描述:语句全无对齐,可读性差,充满多余语句(Exists里面用Row_Number,Group By等)
例如:ComClewService中的一个sql

 

13. 存储过程的GOTO语句

建议:不使用,太长不易维护

例如:[dbo].[pGetGoodsPrice]