欢迎来到天天文库
浏览记录
ID:34757202
大小:53.97 KB
页数:5页
时间:2019-03-10
《如何实现数据库优化》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、如何实现数据库优化1、用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT*FROMT1语句,要用到几列就选择几列如:SELECTCOL1,COL2FROMT1;在可能的情况下尽量限制尽量结果集行数如:SELECTTOP300COL1,COL2,COL3FROMT1,因为某些情况下用户是不需要那么多的数据的。不
2、要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;按照特定顺序提取数据的查找。2、避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: SELECTnameFROMemployeeWHEREsalary>60000 在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转
3、化。 3、尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如: SELECT*FROMT1WHEREF1/2=100应改为: SELECT*FROMT1WHEREF1=100*2SELECT*FROMRECORDWHERESUBSTRING(CARD_NO,1,4)=’5378’应改为:SELECT*FROMRECORDWHERECARD_NOLIKE‘5378%’SELECTmember_number,first_name,last_name FROMmembersWHEREDATEDIFF(yy,dat
4、ofbirth,GETDATE())>21应改为:SELECTmember_number,first_name,last_name FROMmembersWHEREdateofbirth5、 优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。5、尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。6、合理使用EXISTS,NOTEXISTS子句。如下所示:1.SELECTSUM(T1.C1)FROMT1WHERE(SELECTCOUNT(*)FROMT2WHERET2.C2=T1.C2)>02.SELECTSUM(T1.C1)FROMT1WHEREE6、XISTS(SELECT*FROMT2WHERET2.C2=T1.C2)两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:IF(SELECTCOUNT(*)FROMtable_nameWHEREcolumn_name='xxx')可以写成:IFEXISTS(SELECT*FROMtable_nameWHEREcolumn_name='xxx')经常需要写一个T_SQL语句比较一个父结果集和子结7、果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:1.SELECTa.hdr_key FROMhdr_tbla----tbla表示tbl用别名a代替WHERENOTEXISTS(SELECT*FROMdtl_tblbWHEREa.hdr_key=b.hdr_key) 2.SELECTa.hdr_key FROMhdr_tblaLEFTJOINdtl_tblbONa.hdr_key=b.hdr_key WHEREb.hdr_keyISNULL 3.SELECThdr_key FROMhdr_tblWHEREhdr_keyNOTIN(8、SELECThdr_keyFROMdtl_tbl) 三种写法都可以得到同样正
5、 优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。5、尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。6、合理使用EXISTS,NOTEXISTS子句。如下所示:1.SELECTSUM(T1.C1)FROMT1WHERE(SELECTCOUNT(*)FROMT2WHERET2.C2=T1.C2)>02.SELECTSUM(T1.C1)FROMT1WHEREE
6、XISTS(SELECT*FROMT2WHERET2.C2=T1.C2)两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:IF(SELECTCOUNT(*)FROMtable_nameWHEREcolumn_name='xxx')可以写成:IFEXISTS(SELECT*FROMtable_nameWHEREcolumn_name='xxx')经常需要写一个T_SQL语句比较一个父结果集和子结
7、果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:1.SELECTa.hdr_key FROMhdr_tbla----tbla表示tbl用别名a代替WHERENOTEXISTS(SELECT*FROMdtl_tblbWHEREa.hdr_key=b.hdr_key) 2.SELECTa.hdr_key FROMhdr_tblaLEFTJOINdtl_tblbONa.hdr_key=b.hdr_key WHEREb.hdr_keyISNULL 3.SELECThdr_key FROMhdr_tblWHEREhdr_keyNOTIN(
8、SELECThdr_keyFROMdtl_tbl) 三种写法都可以得到同样正
此文档下载收益归作者所有