存储过程的编写:存储过程编写经验和优化措施



  、适合读者对象:数据库开发数据库数据量很多涉及到对SP(存储过程)优化项目开发人员对数据库有浓厚兴趣  

   2、介绍:在数据库开发过程中经常会遇到复杂业务逻辑和对数据库操作这个时候就会用SP来封装数据库操作如果项目SP较多书写又没有规范标准将会影响以后系统维护困难和大SP逻辑难以理解另外如果数据库数据量大或者项目对SP性能要求很就会遇到优化问题否则速度有可能很慢经过亲身经验个经过优化过SP要比个性能差SP效率甚至高几百倍  

   3、内容:  

  1、开发人员如果用到其他库Table或View务必在当前库中建立View来实现跨库操作最好不要直接使用“databse.dbo.table_name”sp_depends不能显示出该SP所使用跨库table或view不方便校验  

  2、开发人员在提交SP前必须已经使用 showplan _disibledevent=>
   vi. 尽量使用exists代替select count(1)来判断是否存在记录count只有在统计表中所有行数时使用而且count(1)比count(*)更有效率

   vii. 尽量使用“>=”不要使用“>”

   viii. 注意些or子句和union子句的间替换

   ix. 注意表的间连接数据类型避免区别类型数据的间连接

   x. 注意存储过程中参数和数据类型关系

   xi. 注意insert、update操作数据量防止和其他应用冲突如果数据量超过200个数据页面(400k)那么系统将会进行锁升级页级锁会升级成表级锁   

  b)索引使用规范标准:

   i. 索引创建要和应用结合考虑建议大OLTP表不要超过6个索引

   ii. 尽可能使用索引字段作为查询条件尤其是聚簇索引必要时可以通过index index_name来强制指定索引

   iii. 避免对大表查询时进行table scan必要时考虑新建索引

   iv. 在使用索引字段作为条件时如果该索引是联合索引那么必须使用到该索引中个字段作为条件时才能保证系统使用该索引否则该索引将不会被使用

   v. 要注意索引维护周期性重建索引重新编译存储过程  

  c)tempdb使用规范标准:

   i. 尽量避免使用distinct、order by、group by、having、join、cumpute这些语句会加重tempdb负担

   ii. 避免频繁创建和删除临时表减少系统表资源消耗

   iii. 在新建临时表时如果次性插入数据量很大那么可以使用select o代替create table避免log提高速度;如果数据量不大为了缓和系统表资源建议先create table然后insert

   iv. 如果临时表数据量较大需要建立索引那么应该将创建临时表和建立索引过程放在单独个子存储过程中这样才能保证系统能够很好使用到该临时表索引

    v. 如果使用到了临时表在存储过程最后务必将所有临时表显式删除先truncate table然后drop table这样可以避免系统表较长时间锁定

    vi. 慎用大临时表和其他大表连接查询和修改减低系统表负担这种操作会在条语句中多次使用tempdb系统表  

  d)合理算法使用:   

  根据上面已提到SQL优化技术和ASE Tuning手册中SQL优化内容,结合实际应用,采用多种算法进行比较,以获得消耗资源最少、效率最高思路方法具体可用ASE调优命令: statistics io on, statistics time on , showplan on 等
Tags:  优化措施 存储过程优化 存储过程编写 存储过程的编写

延伸阅读

最新评论

发表评论