当前位置:  数据库>sqlserver

数据库性能优化三:程序操作优化提升性能

    来源: 互联网  发布时间:2014-10-09

    本文导语:  数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少非常多的程序性能的,下面列出常用错误习惯...

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第三部分 

概述:程序访问优化也可以认为是访问SQL语句的优化,一个好的SQL语句是可以减少非常多的程序性能的,下面列出常用错误习惯,并且提出相应的解决方案

一、操作符优化
1. IN、NOT IN 操作符
IN和EXISTS 性能有外表和内表区分的,但是在大数据量的表中推荐用EXISTS 代替IN 。
Not IN 不走索引的是绝对不能用的,可以用NOT EXISTS 代替
2. IS NULL 或IS NOT NULL操作
索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可
3. 操作符(不等于)
不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 用其它相同功能的操作运算代替,如 a0 改为 a>0 or a''
4. 用全文搜索搜索文本数据,取代like搜索
全文搜索始终优于like搜索:
(1)全文搜索让你可以实现like不能完成的复杂搜索,如搜索一个单词或一个短语,搜索一个与另一个单词或短语相近的单词或短语,或者是搜索同义词;
(2)实现全文搜索比实现like搜索更容易(特别是复杂的搜索);

二、SQL语句优化
1、在查询中不要使用select *
为什么不能使用,地球人都知道,但是很多人都习惯这样用,要明白能省就省,而且这样查询数据库不能利用“覆盖索引”了
2. 尽量写WHERE子句
尽量不要写没有WHERE的SQL语句
3. 注意SELECT INTO后的WHERE子句
因为SELECT INTO把数据插入到临时表,这个过程会锁定一些系统表,如果这个WHERE子句返回的数据过多或者速度太慢,会造成系统表长期锁定,诸塞其他进程。
4.对于聚合查询,可以用HAVING子句进一步限定返回的行
5. 避免使用临时表
(1)除非却有需要,否则应尽量避免使用临时表,相反,可以使用表变量代替;
(2)大多数时候(99%),表变量驻扎在内存中,因此速度比临时表更快,临时表驻扎在TempDb数据库中,因此临时表上的操作需要跨数据库通信,速度自然慢。
6.减少访问数据库的次数:
程序设计中最好将一些常用的全局变量表放在内存中或者用其他的方式减少数据库的访问次数
7.尽量少做重复的工作
尽量减少无效工作,但是这一点的侧重点在客户端程序,需要注意的如下:
A、 控制同一语句的多次执行,特别是一些基础数据的多次执行是很多程序员很少注意的
B、减少多次的数据转换,也许需要数据转换是设计的问题,但是减少次数是程序员可以做到的。
C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。
D、合并对同一表同一条件的多次UPDATE,比如
UPDATE EMPLOYEE SET FNAME='HAIWER' WHERE EMP_ID=' VPA30890F'
UPDATE EMPLOYEE SET LNAME='YANG' WHERE EMP_ID=' VPA30890F'
这两个语句应该合并成以下一个语句
UPDATE EMPLOYEE SET FNAME='HAIWER',LNAME='YANG'
WHERE EMP_ID=' VPA30890F'
E、UPDATE操作不要拆成DELETE操作+INSERT操作的形式,虽然功能相同,但是性能差别是很大的。
F、不要写一些没有意义的查询,比如
SELECT * FROM EMPLOYEE WHERE 1=2

三、where使用原则
1)在下面两条select语句中:
select * from table1 where field1=0;
select * from table1 where field1>=0 and field1=0,则第一条select语句要比第二条select语句效率高的多,因为第二条select语句的第一个条件耗费了大量的系统资源。
第一个原则:在where子句中应把最具限制性的条件放在最前面。
2)在下面的select语句中:
select * from tab where a=… and b=… and c=…;
若有索引index(a,b,c),则where子句中字段的顺序应和索引中字段顺序一致。
第二个原则:where子句中字段的顺序应和索引中字段顺序一致。
以下假设在field1上有唯一索引I1,在field2上有非唯一索引I2。
3) select field3,field4 from tb where field1='sdf' 快
select * from tb where field1='sdf' 慢,
因为后者在索引扫描后要多一步ROWID表访问。
select field3,field4 from tb where field1>='sdf' 快
select field3,field4 from tb where field1>'sdf' 慢
因为前者可以迅速定位索引。
select field3,field4 from tb where field2 like 'R%' 快
select field3,field4 from tb where field2 like '%R' 慢,
因为后者不使用索引。
4) 使用函数如:
select field3,field4 from tb where upper(field2)='RMN'不使用索引。
如果一个表有两万条记录,建议不使用函数;如果一个表有五万条以上记录,严格禁止使用函数!两万条记录以下没有限制。

    
 
 

您可能感兴趣的文章:

  • Oracle 数据库(oracle Database)性能调优技术详解
  • Oracle收购TimesTen 提高数据库软件性能
  • 数据库性能测试工具 PolePosition
  • 数据库性能测试工具 DBT
  • 开源数据库性能测试工具 osdb
  • 关于提高Oracle数据库性能的四个错误认识
  • XML数据库性能测试 TPoX
  • 高性能内存数据库网格 Galaxy
  • 超高性能 key-value 数据库 Redis
  • 高性能 NoSQL 数据库 ArangoDB
  • 校园网,www服务器,邮件服务器,数据库服务器等各用什么平台(系统)性能最佳?
  • 高性能NoSQL数据库 SSDB
  • 数据库复制性能测试 推送模式性能测试
  • SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能
  • 一次SQL调优数据库性能问题后的过程(300W)
  • 数据库中identity字段不必是系统产生的唯一值 性能优化方法(新招)
  • 数据库性能优化二:数据库表优化提升性能
  • 看了半本,是关于java与xml编程的书,它用xml来代替数据库,试问,xml真的能开题数据库吗?(在性能方面)
  • 我实现了个J2EE技术的服务器,支持TCP、UDP和数据库,由于性能的原因,需要改为C或C++实现,我是C、C++新手,我该如何入手呢?看什么样的
  • 数据库性能基准测试 DB-Webbench
  • 用PHP连mysql比oracle数据库性能好
  • Oracle数据库提升效率,用3PAR
  • 善用Oracle表空间设计提升数据库性能
  • 数据库性能优化一:数据库自身优化提升性能
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux和windows下用mysql c++ library操作Mysql数据库
  • 要实现同样的一个问题,例如数据库的查询操作,并将结果返回到页面中,在Servlet与JavaBean中都可以写相同的数据库查询操作的代码,那么
  • 小妹求教!!关于jsp操作oracle数据库操作的问题(文件读取,插入数据库表相应字段中)
  • JAVA与数据库操作问题
  • Linux 下的C语言实现数据库连接池操作。
  • 如何关闭窗口时触发执行数据库操作?急!请帮忙!
  • Python Mysql数据库操作 Perl操作Mysql数据库
  • C++数据库操作接口 SmartDB
  • 讨论ejb中数据库操作问题
  • applet如何实现对数据库(access)的操作,征求设计方案。
  • Linux下提高数据库操作速度
  • PHP数据库操作类 ezSQL
  • 如何创建日志文件?并且纪录对数据库的操作???
  • 求助 关于LONG VARCHAR 或 数据库insert 操作
  • BMP 进行数据库操作,与bean本身有什么关系。。
  • Linux下如何用C语言操作Oracle数据库相关的图书推荐
  • 请问,如果连接一个Mssql的数据库。并操作里面的数据。谢谢了:)
  • unix下C++代码中如何进行数据库操作?给个完整代码学习学习
  • 关于ubuntu系统下数据库操作工具
  • 关于数据库和操作系统的问题
  • jsp中如何操作数据库(给100分)
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 如何监控数据库的数据,如果数据库数据更改,就通知Server
  • mysql iis7站长之家
  • 散分:Jbuilder6开发数据库应用请问你们都用什么数据库? 免费的数据库有那些?
  • 文档数据库mongodb与列式数据库hbase详细比较
  • 如何从数据库中或文本文件中提取数据到另一个数据库中?
  • nosql数据库levedb介绍及levedb最新版1.18下载安装
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 开发java下的数据库程序,用什么数据库引擎?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3