基于局域网的数据库查询优化

点赞:5763 浏览:20371 近期更新时间:2024-01-22 作者:网友分享原创网站原创

摘 要:本文从局域网实际情况出发,为达到提高数据库查询效率和减少数据传输总量的目标,提出了23种具有可操作性的数据库查询优化方法和相关建议,对局域网数据库查询具有帮助意义.

关 键 词:SQL;查询;数据库;优化

中图分类号:F326.13文献标识码:A文章编号:1007-9599(2012)01-0000-02

LAN-basedDatabaseQueryOptimization

HongJing,HeLang

(ChongqingNankaiSecondarySchool,Chongqing400030,China)

Abstratc:Thistextsetoutfromthelocalworkactualcircumstance,forattainanexaltationdatabasesearchefficiencyanddecreasethedatadeliverthetargetoftotalamountandputforward23kindsofdatabasewhichhemaneuverabilitysearchexcellentturnamethodwithrelatedsuggestion,playchessanareaadatabasesearchhelpfulmeaning.

Keywords:SQL,Search,Database,Optimization

一、引言

随着信息时代的到来,大量信息系统在人们日常生活中的广泛运用,有很多单位与企业、学校内部都建立了大量的信息系统.在有限的硬件资源条件下,基于WEB的信息系统运行所遇到的最大瓶颈问题就是大量对数据库的查询操作.而数据库的优化查询算法应该是开发这些系统时应该考虑的内容.

SQL查询语句的优化一直是大家研究的问题,因为这是对数据库的操作中最耗时的工作.虽然不同的查询方案可能某一条SQL语句执行一次的速度相差不大,但是对访问量较大的WEB系统来说,有可能这一条语句一天就要执行成千上万次,累计起来的时间相差就大了.另外,从成本优化的角度出发,每条SQL语句都应该被单独优化,程序员对SQL语句的优化往往可以使查询效率成倍提高.而且,对数据库查询的次数越少,读取数据库存储磁盘次数就越少,就可以延长怎么写作器的使用寿命.下面,根据我参加IBM暑期培训班学习使用数据库的体会和对SQL语句查询研究,下面探讨一下局域网的数据库查询优化.

二、优化目标

在明确优化目标之前,我们应该首先解决为什么要对SQL查询语句进行优化的问题,在实际情况下,往往有一些诸如数据库设计缺陷、用户访问量的急剧增长和增加系统功能模块对数据库结构及功能的影响等需求.

对一个WEB系统,有两个概念是必须关注的:吞吐量和对用户请求的响应时间.这是一对矛盾的两个方面,而在同一个系统中,我们希望吞吐量和对用户请求的响应时间都能达到最佳,这就是对数据库查询进行优化的目标.在一个系统的硬件资源不变的情况下,增加系统的吞吐量往往就会使系统对用户请求的响应时间变长,导致用户需要等待更长的时间才能获得所需要的数据;而如果想减少系统对用户请求的响应时间,这将直接导致系统的吞吐量下降.例如:在组织一次全校学生的期末考试时,当多个用户同时登录网络考试系统,部分用户就会出现网页打开速度很慢,或者根本就打不开的现象,这就是突然间系统访问量急剧增加,数据库访问量同时也大增的结果,但系统的硬件资源并没有变化.所以,这时对系统数据库的查询进行必要的优化就显得尤为重要.

三、优化方案

对一个数据库系统进行优化不是某一条语句就能影响的,而是要对系统的所有SQL语句进行优化设计,是一个系统工程,需要有一整套解决方案.总体来说,对SQL语句进行优化可以从以下23个方面进行优化.

1.首先要尽量避免全表扫描,这是最耗系统资源也最笨的查询方式.如果一定要对全表进行扫描,就应考虑在where及orderby涉及的列上建立索引.

2.要慎用关键字in和notin,否则也会导致全表扫描.

例如:要查看考试科目成绩在及格线边沿(58、59、60、61)的学生姓名,SQL语句可以写为:

select姓名from学生表where考试科目成绩in(58,59,60,61)

对于像这种连续的数值,能用between就不要用in.所以,上面的语句可以改写为:

Select姓名from学生表where考试科目成绩between58and61

3.关键字like也要注意慎用,否则也会导致全表扫描.

例如:要查询学生姓名中含有“张”的所有学生姓名,SQL语句可以写为:

Select姓名from学生表where姓名like'%张%'

这种情况下,若要提高查询效率,可以考虑使用全文检索.

4.在where子句中使用参数,同样会导致全表扫描.这是因为SQL语句是在运行时解析局部变量.所以,要优化该子句就应将其改为在编译时选择.但是,如果在编译时建立访问计划,这时变量的值还是未知的,也无法作为索引选择的输入项.

例如:查询考试科目成绩为90分的学生姓名,SQL语句可以写为:

Select姓名from学生表where成绩等于90

在执行该语句时,将导致数据库引擎对“学生表”所有行进行扫描查询.这时,可以将SQL语句改为强制查询使用索引:

Select姓名from学生表with(index(索引名))where成绩等于90

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

6.在使用where关键字时,应尽量不要在子句中对字段进行表达式操作,这也会导致数据库引擎放弃使用索引而进行全表扫描.

例如:查询考试科目成绩的一半等于30分的学生姓名,SQL语句可以表达为:

Select姓名from学生表where成绩/2等于30


对这种表达式语句,可以改写为:

Select姓名from学生表where成绩等于30*2

7.在where语句中要尽量避免对某一字段进行null值判断,否则将导致数据库引擎放弃使用索引而进行全表扫描.

例如:如果要查询考试科目成绩为0的学生姓名.

select姓名from学生表where考试科目成绩isnull

这时,可以将“考试科目成绩”字段默认值设置为0,然后就可以这样查询:

select姓名from学生表where考试科目成绩等于0

8.在where语句中要尽量避免使用<>或!=等逻辑判断操作符,否则也将导致数据库引擎放弃使用索引而进行全表扫描.

9.在where语句中要尽量避免使用or来连接需要查询的条件,否则也将导致引擎放弃使用索引而进行全表扫描.

例如:要查询考试科目成绩为60或70的学生姓名,SQL语句可以写为:

select姓名from学生表where考试科目成绩等于60or考试科目成绩等于70

这时,可以用union来连接两个查询条件,于是,上面的语句可以改写为:

select姓名from学生表where考试科目成绩等于60

unionall

select姓名from学生表where考试科目成绩等于70

10.不要写一些没有意义的查询,如需要生成一个空表结构:

select列1,列2into#tfrom表名where1等于0

基于局域网的数据库查询优化参考属性评定
有关论文范文主题研究: 关于数据库的论文范文文献 大学生适用: 高校大学论文、本科毕业论文
相关参考文献下载数量: 80 写作解决问题: 怎么撰写
毕业论文开题报告: 论文提纲、论文结论 职称论文适用: 核心期刊、初级职称
所属大学生专业类别: 怎么撰写 论文题目推荐度: 最新题目

这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

createtable#t(...)

11.很多时候用exists来代替in更好:

例如:要查询参加过期中物理考试的学生姓名,SQL语句可以写为:

select姓名from学生表where学生IDin(select学生IDfrom成绩表)

而用下面的语句替换该语句更合适:

select姓名from学生表whereexists(select学生IDfrom成绩表where学生ID等于学生表.学生ID)

12.并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了多大的作用.

13.索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为在使用insert或update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定.一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要.

14.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销.这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了.

15.任何地方都不要使用select*from表名,用具体的字段列表代替“*”,不要返回用不到的任何字段,这只会增加数据库查询资源开销.

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

17.临时表并不是不可使用,适当地使用它们可以使某些例程更有效.例如,当需要重复引用大型表或常用表中的某个数据集时.但是,对于一次性事件,最好使用导出表.

18.在新建临时表时,如果一次性插入数据量很大,那么可以使用selectinto代替createtable,避免造成大量log,以提高速度;如果数据量不大,为了缓和系统表的资源,应先createtable,然后insert.

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

20.尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写.

21.使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效.

22.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理.

23.尽量避免大事务操作,提高系统并发能力.

四、结束语

在我们目前绝大多数局域网环境中,要充分利用有限的硬件资源,尽可能地对数据库查询进行优化,就可大大提高我们局域网的网络质量.要提高整个系统的性能,除了对数据库查询语句进行优化之外,还要注意对数据库的连接和关闭、使用存储过程等其他技术的利用.综合利用就能更大程度地提高WEB系统的数据库性能.