数学建模社区-数学中国

标题: 如何优化数据库的性能 [打印本页]

作者: ilikenba    时间: 2004-5-25 22:21
标题: 如何优化数据库的性能
<B>如何优化数据库的性能</B><B><p></p></B></P>6 j# G1 H/ ^# h+ o2 J; A! E" A
   <B><p></p></B></P>1 }% e: P& v% h6 M6 w$ [% w$ w
1、              <B>硬件调整性能</B>+ J4 w! a1 [- Y7 Z
最有可能影响性能的是磁盘和网络吞吐量,解决办法
8 a5 d* v$ E: N8 o% f' u扩大虚拟内存,并保证有足够可以扩充的空间;把数据库服务器上的不必要服务关闭掉<p></p></P>
* Z7 D; F  b9 r5 ^3 Z9 E% N把数据库服务器和主域服务器分开<p></p></P>
! h  z) ?0 V" B+ J2 }5 \- N9 |3 h8 k把SQL数据库服务器的吞吐量调为最大<p></p></P>5 ^4 t" x9 @  n5 g) e
在具有一个以上处理器的机器上运行SQL<p></p></P>, M4 i. ~" j0 Q3 _- X7 ~, g8 |
2、              <B>调整数据库</B></P>
" d! y- b6 b: R/ ?若对该表的查询频率比较高,则建立索引;建立索引时,想尽对该表的所有查询搜索操作,  按照where选择条件建立索引,尽量为整型键建立为有且只有一个簇集索引,数据在物理上按顺序在数据页上,缩短查找范围,为在查询经常使用的全部列建立非簇集索引,能最大地覆盖查询;但是索引不可太多,执行UPDATE DELETE INSERT语句需要用于维护这些索引的开销量急剧增加;避免在索引中有太多的索引键;避免使用大型数据类型的列为索引;保证每个索引键值有少数行。</P>
0 x' E9 e7 A+ r3 b$ ?6 O) D2 I3、              <B>使用存储过程</B></P>
0 ^3 ^+ l7 y) d8 K8 p应用程序的实现过程中,能够采用存储过程实现的对数据库的操作尽量通过存储过程来实现,因为存储过程是存放在数据库服务器上的一次性被设计、编码、测试,并被再次使用,需要执行该任务的应用可以简单地执行存储过程,并且只返回结果集或者数值,这样不仅可以使程序模块化,同时提高响应速度,减少网络流量,并且通过输入参数接受输入,使得在应用中完成逻辑的一致性实现。</P>. v4 k0 X) c5 [3 h* b  q
4、              <B>应用程序结构和算法</B></P>
- k7 |  p9 g: d0 o0 K+ S: c    建立查询条件索引仅仅是提高速度的前提条件,响应速度的提高还依赖于对索引的使用。因为人们在使用SQL时往往会陷入一个误区,即太关注于所得的结果是否正确,特别是对数据量不是特别大的数据库操作时,是否建立索引和使用索引的好坏对程序的响应速度并不大,因此程序员在书写程序时就忽略了不同的实现方法之间可能存在的性能差异,这种性能差异在数据量特别大时或者大型的或是复杂的数据库环境中(如联机事务处理OLTP或决策支持系统DSS)中表现得尤为明显。在工作实践中发现,不良的SQL往往来自于不恰当的索引设计、不充份的连接条件和不可优化的where子句。在对它们进行适当的优化后,其运行速度有了明显地提高!<p></p></P>( d+ y# u$ l+ L3 Y# s
因此在书写应用程序的SQL的 where子句时,注意以下几种情况: <p></p></P>0 k0 [  }$ F8 z7 R. a! Z3 g
1、避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: </P>& V% Z" ~; v0 s) _4 g) b9 q3 D
SELECT name FROM employee WHERE salary > 60000 </P>1 y" N3 ^. C" L& \: A- L4 |$ j
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。 </P>
. _' q1 h( T; ~, W2、避免对搜索参数使用其它数学操作符,如要将 </P>+ i& e3 W5 `" {5 Q! W: t
SELECT name FROM employee WHERE SUBSTRING(id, 1, 1) = 'B' </P>& }$ d8 t0 p4 {$ U  l
SELECT name FROM emplyee WHERE salary * 12 > 30000 </P>& V  U: J3 O; g% r8 K9 h
写成为: </P>
9 q; }- ~& M. a- e" t1 a2 E5 N  cSELECT name FROM employee WHERE id like ‘B%' </P>
4 h) o2 v- S  v, lSELECT name FROM emplyee WHERE salary > 3000 </P>% ~0 `0 Y2 C7 `% \! J1 Z
3、、避免使用!=或<>等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如: </P>1 I: s: ~6 X. D+ N8 b* ~
SELECT id FROM employeeWHERE id != 'B%' </P>
; w" [8 ~' w8 [8 r2 m优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。 </P>6 b1 ]- a& L- [/ A% ]
4、在应用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;算法的结构尽量简单;在查询时,不要过多地使用通配符如select * 语句;尽量不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;按照特定顺序提取数据的查找。</P>
( T1 z2 ^. i  |0 T! ^9 f0 d* b上面我们提到的是一些基本的提高查询速度的注意事项,但是在更多的情况下,程序员往往需要反复试验比较不同的语句以得到最佳方案。此外更为重要的是需要数据库管理员在数据库的服务器一端调整数据库管理系统的参数,以得到更快的响应性能。 </P>
作者: afogy    时间: 2004-6-13 22:39
<>不错不错:)</P>
作者: wanlin    时间: 2004-12-30 20:27
见到你的文章真高兴!能介绍java数据库的书看看吗?
作者: chenlk    时间: 2005-4-9 15:09
值得看,谢谢!
作者: lsf1982    时间: 2005-6-1 19:00
<>不错啊,值得一看</P>




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5