今上午公司技术研究部(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]