【2007】知识是需要沉淀的;
思想是在不断学习,磨练中成熟的;
技术是在创新中开拓的……………
【2007】不经历风雨,怎能见彩虹,没有人能随随便便成功。加油!
Oracle SQL的优化
上一篇 /
下一篇 2006-12-16 12:19:19
/ 个人分类:Oracle
BL4N%Kt-L051Testing软件测试网*h+el.d
O)t-_(J
s+p/G
1.SELECT子句中避免使用 ' * '
.fh~A~5t4\;f
U:q0 当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 '*' 是一个方便的方法。不幸的是,这是一个非常低效的方法。实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
)\G&lg1Ou}wc[051Testing软件测试网T2zX
C@
KAH,|Dz2.用TRUNCATE替代DELETE51Testing软件测试网/}*i
s/D&QI \7q:{
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息。 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)。 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复。因此很少的资源被调用,执行时间也会很短。51Testing软件测试网5{0MGz"_!~2?&v
51Testing软件测试网)a0k4V2R#of4K3.尽量多使用COMMIT
x'R4`P'I0 只要有可能,在程序中尽量多使用COMMIT,这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少51Testing软件测试网5cJ
_D|
H_"ow
COMMIT所释放的资源:51Testing软件测试网TAp1t0w6Fdi
A、回滚段上用于恢复数据的信息。51Testing软件测试网?;C y-?TgK
B、被程序语句获得的锁。
Si
I,`1wI|)i
Li'PN6i0 C、redo log buffer 中的空间。
3G
@3}sz0 D、ORACLE为管理上述3种资源中的内部花费。
i+jub3mNp0w;}
eWzl]04.计算记录条数
L.E^:pH%S0 和一般的观点相反,count(*) 比count(1)稍快,当然如果可以通过索引检索,对索引列的计数仍旧是最快的。例如 COUNT(EMPNO)51Testing软件测试网j?4MBHo$y`
51Testing软件测试网
t-`N+P-X:s%_5.WHERE子句中的连接顺序
Th}`&hCGy0 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。
;Ak\?9~9F8o0hET051Testing软件测试网2B0rboe|W#[y6.共享SQL语句51Testing软件测试网9Di0d"?bU
为了不重复解析相同的SQL语句,在第一次解析之后,ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA (system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。51Testing软件测试网i{t#NU [
可惜的是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