`
liyong1115
  • 浏览: 11591 次
  • 性别: Icon_minigender_1
  • 来自: 0
社区版块
存档分类
最新评论

SQL性能<9>

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

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

  三、内容:  

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

  2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。  

  3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:   

  a)SQL的使用规范:

   i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。

   ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。

   iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。

   iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。

   v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

   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 into代替create table,避免log,提高速度;如果数据量不大,为了缓和系统表的资源,建议先create table,然后insert。

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

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

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

  d)合理的算法使用:   

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

分享到:
评论

相关推荐

    lecco sql export pro(SQL优化器)

    &lt;br&gt;&lt;br&gt; 2、以人工智能知识库“反馈式搜索引擎”来重写性能优异的SQL语句;&lt;br&gt;&lt;br&gt; 3、找出所有等效的SQL语句及可能的执行计划;&lt;br&gt;&lt;br&gt; 4、产生相同的结果;&lt;br&gt;&lt;br&gt; 5、先进的SQL语法分析器能处理最复杂的...

    数据库程序设计—— SQL Server 2000 数据库程序设计(DOC+PPT)

    SQL介绍&lt;br&gt;第6章 使用 Transact-SQL查询工具&lt;br&gt;第7章 检索数据&lt;br&gt;第8章 数据分组与汇总&lt;br&gt;第9章 多表联接&lt;br&gt;第10章 子查询&lt;br&gt;第11章 修改数据&lt;br&gt;第12章 全文索引查询 &lt;br&gt;第13章 规划索引&lt;br&gt;第14章 创建和...

    Oracle 9i Java程序设计——使用PL/SQL和Java的解决方案

    &lt;br&gt;原书名:Oracle 9i Java Programming&lt;br&gt;&lt;br&gt;Oracle 9i Java程序设计——使用PL/SQL和Java的解决方案 &lt;br&gt;&lt;br&gt;【原出版社】 Wrox Press &lt;br&gt;【作 者】Bjarki Holm,John Carnell等 &lt;br&gt;【译 者】 康博 &lt;br&gt;【丛 ...

    SQL2005入门到精通(25)

    监控SQL Server状态 508&lt;br&gt;25.1 查看当前活动 508&lt;br&gt;25.1.1 使用活动监视器 508&lt;br&gt;25.1.2 动态管理对象 510&lt;br&gt;25.2 使用系统性能监视器 512&lt;br&gt;25.2.1 运行系统性能监视器 513&lt;br&gt;25.2.2 SQL Server性能对象 ...

    SQL技术文摘

    &lt;br&gt;使用联接来查询多个表&lt;br&gt;SET NOCOUNT { ON | OFF } 说明&lt;br&gt;用sp_lock诊断SQL Sever的性能问题 &lt;br&gt;sql server临时表&lt;br&gt;如何保存数据库连接参数代码及步骤详解 &lt;br&gt;用数据源访问数据库&lt;br&gt;GDI+ 在Delphi程序的...

    C#编程经验技巧宝典

    8&lt;br&gt;&lt;br&gt;0018 有效利用Visual Studio 2005附带程序 8&lt;br&gt;&lt;br&gt;0019 有效使用MSDN帮助 9&lt;br&gt;&lt;br&gt;0020 如何设置MSDN帮助 9&lt;br&gt;&lt;br&gt;1.4 其他 10&lt;br&gt;&lt;br&gt;0021 如何添加项目引用 10&lt;br&gt;&lt;br&gt;0022 如何添加Web...

    MyBatis动态拼接SQL

    MyBatis通过`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;`, `&lt;foreach&gt;`等标签来实现动态SQL的构建。 1. `&lt;if&gt;`标签:用于判断某个条件是否成立,如果成立则插入相应的SQL片段。例如,当查询...

    mysql5.1中文手册

    MySQL对标准SQL的扩展&lt;br&gt;1.8.5. MySQL与标准SQL的差别&lt;br&gt;1.8.6. MySQL处理约束的方式&lt;br&gt;2. 安装MySQL&lt;br&gt;2.1. 一般安装问题&lt;br&gt;2.1.1. MySQL支持的操作系统&lt;br&gt;2.1.2. 选择要安装的MySQL分发版&lt;br&gt;2.1.3. 怎样...

    Java数据编程指南

    SQLJ&lt;br&gt;简介&lt;br&gt;什么是SQLJ&lt;br&gt;准备开始&lt;br&gt;使用SQLJ&lt;br&gt;SQLJ定制&lt;br&gt;小结&lt;br&gt;第9章 数据库性能问题&lt;br&gt;本地编译机制&lt;br&gt;挑选适当的JDBC驱动程序&lt;br&gt;连接池&lt;br&gt;事务和批量查询&lt;br&gt;存储过程和JDBC准备语句&lt;br&gt;JDBC...

    AppFramework_V1.0_New

    720&lt;br&gt;1.59&lt;br&gt;&lt;br&gt;1.53&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;表II –50并发4循环(数据库和测试机分开)&lt;br&gt;&lt;br&gt;对比项目&lt;br&gt;iBatis2.0&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt;AppFramework&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt;后者前者性能对比&lt;br&gt;&lt;br&gt;(倍)&lt;br&gt;...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    720&lt;br&gt;1.59&lt;br&gt;&lt;br&gt;1.53&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;表II –50并发4循环(数据库和测试机分开)&lt;br&gt;&lt;br&gt;对比项目&lt;br&gt;iBatis2.0&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt;AppFramework&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt;后者前者性能对比&lt;br&gt;&lt;br&gt;(倍)&lt;br&gt;...

    AppFramework_V1.0

    AppFramework&lt;br&gt;&lt;br&gt;(毫秒)&lt;br&gt; 后者前者性能对比&lt;br&gt;&lt;br&gt;(倍)&lt;br&gt; &lt;br&gt;根据主键获取实体&lt;br&gt;&lt;br&gt;(20次单条select)&lt;br&gt; 19.8&lt;br&gt; 16.1&lt;br&gt;&lt;br&gt;QueryFilter:18.0&lt;br&gt; 1.23&lt;br&gt;&lt;br&gt;1.10&lt;br&gt; &lt;br&gt;每秒插入实体&lt;br&gt;...

    Linux环境数据库管理员指南

    在Linux上安装MySQL 198&lt;br&gt;7.1 引言 198&lt;br&gt;7.2 安装 199&lt;br&gt;7.2.1 命名...性能 210&lt;br&gt;7.4 问题 212&lt;br&gt;7.4.1 线程 213&lt;br&gt;7.4.2 运行环境 213&lt;br&gt;7.5 故障处理 214&lt;br&gt;7.6 小结 215&lt;br&gt;7.7 常见问答 216&lt;br&gt;第8章...

    项目辅助开发器 1.0 Beta2

    采用多线程优化窗体性能&lt;br&gt;3.修正了带参数SQL语句的类型问题&lt;br&gt;&lt;br&gt;&lt;br&gt;1.0 Beta1版本功能&lt;br&gt;&lt;br&gt;1.主界面仿VS编译器效果,界面用起来更熟悉。&lt;br&gt;2.可模拟查询分析器执行TSQL语句&lt;br&gt;3.支持SQL Server 2000、SQL...

    Java实现的分页工具类

    PageResult&lt;T&gt; result = new PageResult&lt;&gt;(); // 参数校验 if (pageNumber &lt;= 0 || pageSize &lt;= 0) { throw new IllegalArgumentException("页数和每页大小必须大于0"); } try (Connection conn = ...

    项目辅助开发器1.0 Beta3

    采用多线程优化窗体性能&lt;br&gt;3.修正了带参数SQL语句的类型问题&lt;br&gt;&lt;br&gt;&lt;br&gt;1.0 Beta1版本功能&lt;br&gt;&lt;br&gt;1.主界面仿VS编译器效果,界面用起来更熟悉。&lt;br&gt;2.可模拟查询分析器执行TSQL语句&lt;br&gt;3.支持SQL Server 2000、SQL...

    爱码者建站引擎系统 V1.0

    基于模板化高性能的建站引擎系统&lt;br&gt;&lt;br&gt;包括新闻管理、频道管理、模板管理、用户管理、数据库管理、友情链接管理等&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;data文件夹内是数据库,先还原数据库,数据库名为acms,如果更改的或web....

    淮海建站企业专业版 ASP+ACCESS

    &lt;br&gt;&lt;br&gt;&lt;br&gt;淮海建站 &lt;br&gt;管理首页 | 网站首页 &lt;br&gt;退出后台 | &lt;br&gt;系统设置 &lt;br&gt;系统配置 | 留言管理 &lt;br&gt;数据库管理 | &lt;br&gt;栏目管理 &lt;br&gt;新建栏目 | 栏目管理 &lt;br&gt;单页内容 &lt;br&gt;企业简介 &lt;br&gt;友情连接 &lt;br&gt;组织...

    SQL sever2005_04.ppt

    SQL Server 2005在前一版本的基础上进行了诸多改进和增强,包括性能优化、安全性提升、新的开发工具和更丰富的管理功能。 在SQL Server 2005中,SQL(Structured Query Language)语言是操作数据库的核心工具。SQL...

    电子商务购物中心系统

    电子商务购物中心系统功能描述:&lt;br&gt;完全公开源代码,并无任何许可限制&lt;br&gt;特别基于大型电子商务网站的系统开发&lt;br&gt;Microsoft SQL Server 2000后台数据库&lt;br&gt;基于类模块的扩展数据访问能力支持任何类型的大型数据库&lt;br...

Global site tag (gtag.js) - Google Analytics