![数据库查询优化试验报告SQLServer2008_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/2ab5b542-1685-403a-8691-78a8097566ec/2ab5b542-1685-403a-8691-78a8097566ec1.gif)
![数据库查询优化试验报告SQLServer2008_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/2ab5b542-1685-403a-8691-78a8097566ec/2ab5b542-1685-403a-8691-78a8097566ec2.gif)
![数据库查询优化试验报告SQLServer2008_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/2ab5b542-1685-403a-8691-78a8097566ec/2ab5b542-1685-403a-8691-78a8097566ec3.gif)
![数据库查询优化试验报告SQLServer2008_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/2ab5b542-1685-403a-8691-78a8097566ec/2ab5b542-1685-403a-8691-78a8097566ec4.gif)
![数据库查询优化试验报告SQLServer2008_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-3/13/2ab5b542-1685-403a-8691-78a8097566ec/2ab5b542-1685-403a-8691-78a8097566ec5.gif)
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、SQLServer2008数据查询的优化方法研究摘要随着数据存储需求的日益增长,对关系数据的管理和访问就成为数据库技术必须解决的问题。本文主要论述关系数据库查询优化技术,并从它的优化技术进行深入探讨,对系统实现做了一定的论述,并进行了部分的程序实现。关键词:数据库查询系统优化引言SQLServer是是由微软公司开发的基于Windows操作系统的关系型数据库管理系统,它是一个全面的、集成的、端到端的数据解决方案,为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。目前,许多中小型企业的数据库应用系统都是用SQLServer作为后台数据库管理系统设计开发的。设计一个应用系
2、统并不难,但是要想使系统达到最优化的性能并不是一件容易的事。根据多年的实践,由于初期的数据库中表的记录数比较少,性能不会有太大问题,但数据积累到一定程度,达到数百万甚至上千万条,全面扫描一次往往需要数十分钟,甚至数小时。20%的代码用去了80%的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。如果用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟。而且我们知道,目前数据库系统应用中,查询操作占了绝大多数,查询优化成为数据库性能优化最为重要的手段之一。影响查询效率的因素SQLServer处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给SQLSe
3、rver的查询优化器,查询优化器通过检查索引的存在性、有效性和基于列的统计数据来决定如何处理扫描、检索和连接,并生成若干执行计划,然后通过分析执行开销来评估每个执行计划,从中选出开销最小的执行计划,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。所以,SQLServer中影响查询效率的因素主要有以下几种:1 .没有索引或者没有用到索引。索引是数据库中重要的数据结构,使用索引的目的是避免全表扫描,减少磁盘I/O,以加快查询速度。2 .没有创建计算列导致查询不优化。3 .查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。4 .返回
4、了不必要的行和列。5 .查询语句不好,没有优化。其中包括:查询条件中操作符使用是否得当;查询条件中的数据类型是否兼容;对多个表查询时,数据表的次序是否合理;多个选择条件查询时,选择条件的次序是否合理;是否合理安排联接选择运算等。SQLServer数据查询优化方法1、避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:selectnamefromemployeewheresalary>60000在这条语句中,如salary字段是money型的,则优化器很
5、难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。2、尽量避免在where子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:select*fromt1wheref1/2=100应改为:select*fromt1wheref1=100*2select*fromrecordwheresubstring(card_no,1,4)=?5378?应改为:select*fromrecordwherecard_nolike,5378%?selectmember_number,first_name,last_namefrommem
6、berswheredatediff(yy,datofbirth,getdate()>21应改为:selectmember_number,first_name,last_namefrommemberswheredateofbirth<dateadd(yy,-21,getdate()即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。3、 避免使用!=或<>、isnull或isnotnull、in,notin等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如:selectidfromemployeew
7、hereid!=b%优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。4、 尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。5、 合理使用exists,notexists子句。如下所示:1.selectsum(t1.c1)fromt1where(selectcount(*)fromt2wheret2.c2=t1.c2>0)2.selectsum(t1.c1)fromt1whereexists(
8、select*fromt2wheret2.c2=t1.c2)两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用exists代替。如:if(selectcount(*)fromtable_namewherecolumn_name=xxx)可以写成:ifexists(select*fromtable_namewherecolumn_name=xxx)6、 尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。见如下例子:select*f
9、romt1wherenamelike,%l%?select*fromt1wheresubsting(name,2,1)=?l?select*fromt1wherenamelike,l%?即使name字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。7、 分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在where子句中将连接条件完整的写上,有可能大大提高查询速度。例:selectsum(a.amount)fromaccounta,cardbwherea.card_no=b.card_nose
10、lectsum(a.amount)fromaccounta,cardbwherea.card_no=b.card_noanda.account_no=b.account_no第二句将比第一句执行快得多。8、 消除对大型表行数据的顺序存取尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。如:select*fromorderswhere(customer_num=104andorder_num>1001)ororder_num=1008解决办法可以使用并集来避免顺序存取:select*fromorderswherecustomer_num=104andorder
11、_num>1001unionselect*fromorderswhereorder_num=1008这样就能利用索引路径处理查询。9、避免困难的正规表达式like关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:select*fromcustomerwherezipcodelike"98"即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为select*fromcustomerwherezipcode>“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。10、使用视图加速查询把表的一个子
12、集进行排序并创建视图,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:,rcvbles.balance,othercolumnsfromcust,rcvbleswherecust.customer_id=rcvlbes.customer_idandrcvblls.balance>0andcust.postcode>“98000”如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个视图中,并按客户的名字进行排序:createviewdbo.v_cust_rcvlbes
13、,rcvbles.balance,othercolumnsfromcust,rcvbleswherecust.customer_id=rcvlbes.customer_idandrcvblls.balance>0然后以下面的方式在视图中查询:select*fromv_cust_rcvlbeswherepostcode>“98000”视图中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘i/o,所以查询工作量可以得到大幅减少。11、能够用between的就不要用inselect*fromt1whereid
14、in(10,11,12,13,14)改成:select*fromt1whereidbetween10and14因为in会使系统无法使用索引,而只能直接搜索表中的数据。12、distinct的就不用groupbyselectorderidfromdetailswhereunitprice>10groupbyorderid可改为:selectdistinctorderidfromdetailswhereunitprice>1013、 部分利用索引1.selectemployeeid,firstname,lastnamefromnameswheredept=prodorcity=orla
15、ndoordivision=food2.selectemployeeid,firstname,lastnamefromnameswheredept=produnionallselectemployeeid,firstname,lastnamefromnameswherecity=orlandounionallselectemployeeid,firstname,lastnamefromnameswheredivision=food如果dept列建有索引则查询2可以部分利用索引,查询1则不能。14、 能用unionall就不要用unionunionall不执行selectdistinct函数,这
16、样就会减少很多不必要的资源15、 不要写一些不做任何事的查询如:selectcol1fromt1where1=0selectcol1fromt1wherecol1=1andcol1=2这类死码不会返回任何结果集,但是会消耗系统资源。16、 尽量不要用selectinto语句。selectinot语句会导致表锁定,阻止其他用户访问该表。17、必要时强制查询优化器使用某个索引select*fromt1wherenextprocess=1andprocessidin(8,32,45)改成:select*fromt1(index=ix_processid)wherenextprocess=1andprocessidin(8,32,45)则查询优化器将会强行利用索引ix_processid执行查询。18、虽然update>delete语句的写法基本固定,但是还是对update语句给出以下建议:a)尽量不要修改主键字段。b)当修改varchar型字段时,尽量使用相同长度内容的值代替。c)尽量最小化对于含有update触发器的表的upda
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论