【2007】知识是需要沉淀的; 思想是在不断学习,磨练中成熟的; 技术是在创新中开拓的…………… 【2007】不经历风雨,怎能见彩虹,没有人能随随便便成功。加油!

Oracle SQL的优化

上一篇 / 下一篇  2006-12-16 12:19:19 / 个人分类:Oracle

B L4N%Kt-L051Testing软件测试网*h+el.d O)t-_(J s+p/G
1.SELECT子句中避免使用 ' * '
.fh~A~5t4\;f U:q0     当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。

)\G&lg1O u}wcesting软件测试网T2zX C@ KAH,|Dz

2.用TRUNCATE替代DELETE51Testing软件测试网/}*i s/D&Q I\7q:{
     当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息。 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)。 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短。51Testing软件测试网5{0MGz"_!~2?&v

51Testing软件测试网)a0k4V2R#of4K

3.尽量多使用COMMIT
x'R4`P'I0     只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少51Testing软件测试网5cJ _D| H_"ow
     COMMIT所释放的资源:51Testing软件测试网TAp1t0w6Fdi
     A、回滚段上用于恢复数据的信息。51Testing软件测试网?;C y-?Tg K
     B、被程序语句获得的锁。
S i I,`1wI|)i Li'PN6i0     C、redo log buffer 中的空间。
3G @3}sz0     D、ORACLE为管理上述3种资源中的内部花费。

i+jub3mNp0

w;} eWzl]04.计算记录条数
L.E^:pH%S0     和一般的观点相反,count(*) 比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的。例如 COUNT(EMPNO)51Testing软件测试网j?4MB Ho$y`

51Testing软件测试网 t-`N+P-X:s%_

5.WHERE子句中的连接顺序
Th }`&hCGy0     ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

;A k\ ?9~9F8o0hET051Testing软件测试网2B0rboe|W#[y

6.共享SQL语句51Testing软件测试网9Di0d"?bU
     为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA (system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。51Testing软件测试网i{t#N U[
     可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering),这个功能并不适用于多表连接查询。 数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。 当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句。这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须完全相同(包括空格,换行等)。 数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了。51Testing软件测试网 Y%|3_eK
     共享的语句必须满足三个条件:
+wm5Gm f3l'b9O:u0 A、 字符级的比较: 当前被执行的语句和共享池中的语句必须完全相同。
-^PGf \]%I0 B、 两个语句所指的对象必须完全相同:
LF`{B |[0 C、 两个SQL语句中必须使用相同的名字的绑定变量(bind variables)。51Testing软件测试网7v o(d[(Y%L:_G o.zBf

_I7D:`Z07.使用表的别名(Alias)51Testing软件测试网*x)Z9K!ds
     当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上。这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。

vV3AoxCH}I:q0

TAG: oracle SQL 优化 Oracle

 

评分:0

我来说两句

Open Toolbar