欢迎来到论文网! 识人者智,自知者明,通过生日认识自己! 生日公历:
网站地图 | Tags标签 | RSS
论文网 论文网8200余万篇毕业论文、各种论文格式和论文范文以及9千多种期刊杂志的论文征稿及论文投稿信息,是论文写作、论文投稿和论文发表的论文参考网站,也是科研人员论文检测和发表论文的理想平台。lunwenf@yeah.net。
您当前的位置:首页 > 科技论文 > 计算机论文

基于SQL SERVER的数据库查询优化浅析

时间:2011-04-23  作者:秩名

论文导读:在数据库的众多应用实例中,相对于数据库的其他操作,查询操作所占的比重最大,根据ACM的统计资料,数据库管理系统80%以上的工作是用于数据的查询和检索。因此,查询速度的快慢直接影响到数据库系统的性能。为了优化数据库系统的性能,除了可以通过改进数据库使用的硬件条件、软件环境和规范化设计外,数据查询的优化,提高查询的响应时间对于改善SQLServer性能也至关重要。
关键词:SQLSERVER,数据库,查询,优化
 

1 概述

在数据库的众多应用实例中,相对于数据库的其他操作,查询操作所占的比重最大,根据 ACM 的统计资料, 数据库管理系统80%以上的工作是用于数据的查询和检索。因此,查询速度的快慢直接影响到数据库系统的性能。为了优化数据库系统的性能,除了可以通过改进数据库使用的硬件条件、软件环境和规范化设计外,数据查询的优化,提高查询的响应时间对于改善SQLServer 性能也至关重要。

2 逻辑结构设计

关系的规范化是一种根据关系的属性间函数相关性的规则把数据分布到多个表的技术。规范化程度较高,进行查询时就容易会产生占用较高系统资源和高I/O的代价,会降低系统响应时间。为了提高数据库的性能,可使用含有一定数据冗余的较低范式的关系,当然这种样做会使系统产生数据不一致性问题。因此在数据库的逻辑设计时,我们需要在数据冗余度和响应时间上进行权衡考虑,灵活的采用规范化和非规范化相结合的策略进行数据库设计。

2.1减少连接运算

连接运算是开销很大的操作,参与连接的关系越多、越大,开销也越大。必须进行连接时,一般要先使用选择、投影等操作把不需要的数据都去掉,以减少连接的负担。

我们数据库设计时,规范化设计一般是将非规范化的实体分割成较小的列和更多的表,从而减少数据的冗余,消除更新、删除异常。但关系划分的越细,我们在查询时就会涉及到多张表,要使用多的连接,从而就会大大降低查询的效率。所以我们数据库设计时,并非达到的范式越高越好,为了保证查询性能,有时不得不牺牲规范化的要求选择较低的范式。

2.2 分割关系

关系的大小对查询的速度影响颇大,有时候我们会将一个很大的关系分割成几个小的关系来提高查询。

(1)从垂直方向分割关系。若把一个关系中常用的属性和很少使用的属性分成两个关系,则可提高常用查询的速度,要注意的是分割时,每个关系中都必须含有首要关键字。

(2)水平分割关系。例如关于学生的数据,可以把全校学生的数据放在一个关系中,也可按系建立学生关系。前者对全校范围的查询是方便的,后者可以显著提高一个系范围内的查询速度。如果一般的查询都由系里的人员进行,查询的是本系内的内容,则按系建立学生关系可以提高性能。如果数据库系统有多个磁盘驱动器,则可把水平分割的关系分布在不同的磁盘组上,可以并行访问,提高数据库的性能。

3 物理结构设计

物理结构设计的目的是使数据库中数据以合理的存储结构和存储方法存储在物理设备上。

(1)当进行数据存储时把频繁被访问的数据或记录同较少被访问的数据或记录分开,分别放到高速和低速存储设备上。

(2)把text、image和大二进制类型字段列存放在一个单独的物理设备上可以提高访问的性能。

(3)选择合适的字段类型,特别是对于被索引的列更是如此。比如能使用tinyint类型就不要用bigint类型,这样的关系可以减少I/O操作。

4 合理使用索引

当SQL Server需要定位某一行记录或某一范围的记录时,首先确定表中是否存在索引:如果不存在有效的索引,则对整个表进行逐行的扫描;如果存在索引,则使用索引对数据进行访问。索引的作用即相当于书的日录,通过索引可快速定位所需要查找的内容,避免全表搜索的发生。

但使用索引也存在如下的问题:一是索引需要占用额外的存储空间;二是在数据进行更新时,索引也要作出相应的更新,因此会增加许多额外的开销。因此,索引的使用要恰到好处。

可以考虑建立索引的列:

(1)主键

通常,检索、存取表是通过主键来进行的。因此,应该考虑在主键上建立索引。

(2) 连接中频繁使用的列

用于连接的列若按顺序存放,系统可以很快地执行连接。如外键,除用于实现参照完整性外,还经常用于进行表的连接。

(3) 在某一范围内频繁搜索的列和按排序顺序频繁检索的列。

不考虑创建索引的列:

(1) 很少或从来不在查询中引用的列,因为系统很少或从来不根据这个列的值去查找数据行。

(2)只有两个或很少几个值的列(如性别,只有两个值“男”或“女”),以这样的列创建索引并不能得到建立索引的好处。

(3)以bit、text、image数据类型定义的列。

(4)数据行数很少的小表一般也没有必要创建索引。

表上的索引过多会影响更新、插入、删除的性能,因为所有的索引都须做相应的调整;另外,所有的分页操作都被记录在日志中,这也会增加I/O操作。索引应根据需要而定,不要盲目多建。

5 查询语句优化

用户所写的查询语句的优劣对于查询效率至关重要。

5.1 简化排序

应简化或避免对大型表进行重复的排序。如果排序不可避免,则应尽量简化它,如缩小排序的列的范围等。

5.2 使用exist谓词代替in子查询

子查询含有exists谓词时,子查询都只要判断逻辑的真假。这样DBMS的优化器就仅根据索引就可以完成工作。因此使用exists谓词查询效率能比In子查询效率高。此外尽可能用not exists代替not in也可提高查询效能。

5.3尽量避免相关子查询。

SQL中的嵌套查询分为两种'相关子查询和非相关子查询。相关子查询是一个列的标签同时在主查询和where子句中的查询中出现,执行时子查询的查询条件要依赖于主查询所访问的一个记录行。当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免这种相关子查询,如不能避免时,那么要在子查询中过滤掉尽可能多的行。

5.4尽可能使用“=”代替like子句

LIKE关键字支持模糊匹配,但这种模糊匹配耗时间。如果可以替换,那么使用“=”操作符的WHERE子句性能最好。

5.5优化SELECT子句

SELECT*请求返回的是查询表中所有的列。如果在SELECT子句中只选择必要的列,那相对于SELECT *子句可减少客服之间的通信量,当客服连接距离比较远时更明显。

5.6尽量不用游标

因为游标会引起页级和表级锁,且消耗网络资源,又有较多的处理指令,所以除非必要,尽量不用游标,而采用等价的语句,即使语句会涉及到多个表扫描,也会更好'在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,这样可使性能得到明显提高'

5.7存储过程的使用

存储过程是 SQL Server 服务器上一组预先定义并编译好的 Transact- SQL 语句,当一个存储过程被第一次运行时,SQL Server 将该存储过程放入内存并完全编译。在该存储过程被再次调用时可以被马上处理, 没有任何额外开销。充分利用存储过程,可以减少网络流量,加快执行速度,提高查询性能,同时也减少程序员的编程工作量。

6 结束语

SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的/次数,尽量避免表搜索的发生的性能优化是一个复杂的过程。上述这些只是涉及应用层次的一些设计方法,深入研究还会涉及数据库层的资源配置!网络层的流量控制以及操作系统层的总体设计。


参考文献
[1] 杨学全,SQL SERVER实例教程(第2版),电子工业出版社:北京.2007
[2] 史嘉权,数据库系统概论,清华大学出版社:北京.2006
[3] 柳佳刚,刘高嵩.数据库查询性能优化的探讨,福建电脑.
[4] 柴美娟,基于关系数据库的查询优化,浙江工商职业技术学院学报,2005
[5] 刘 辉,数据库的查询优化,铜业工程,2005
[6] 金天荣,SQL Server 的查询优化方法的设计和实现
 

 

查看相关论文专题
加入收藏  打印本文
上一篇论文:基于SQL Server 2005安全性机制的研究
下一篇论文:基于SQLServer数据库查询优化的几点思考
科技论文分类
科技小论文 数学建模论文
数学论文 节能减排论文
数学小论文 低碳生活论文
物理论文 建筑工程论文
网站设计论文 农业论文
图书情报 环境保护论文
计算机论文 化学论文
机电一体化论文 生物论文
网络安全论文 机械论文
水利论文 地质论文
交通论文
相关计算机论文
最新计算机论文
读者推荐的计算机论文