• 博客访问: 7792387
  • 博文数量: 798
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-16 22:27
  • 认证徽章:
个人简介

Oracle ACE 总监,OCM联盟(ocmu.org)创始人,恩墨学院(enmoedu.com)创始人,ITPUB Oracle专题深入讨论版版主,资深Oracle数据库专家,北京大学理学硕士,获Oracle OCM 10g 11g认证,ACOUG核心成员,DATAGURU专家团成员,Blogger。Good luck.

文章分类

全部博文(798)

文章存档

2013年(1)

2012年(18)

2011年(156)

2010年(302)

2009年(309)

2008年(7)

2007年(5)

分类: Linux操作系统

2009-09-03 21:21:00

1.目前普遍采用的10g数据库已经采用CBO的优化方式,所以记得定期的对数据库核心业务用户进行全面或有选择的分析,防止出现执行计划出现异常。
Oracle 10g以及以后的11g自动化一切的背后隐藏着很多神秘而有趣的东西。

2.充分共享SQL语句,方法是在书写程序的时候尽量使用绑定变量
是否能共享SQL语句需要满足如下三个条件:
1)能共享的SQL语句需要每个字符都要完全一样,即使是空格的数量也要一样;
2)需要语句所引用的的对象必须完全相同,如果引用的是不同用户的内容也无法共享
3)绑定变量的名字要求必须一样

3.程序中全面禁止使用select *样式的SQL语句
原因之一:Oracle会将“*”依次转换成所有的列名,需要查询数据字典,耗费资源;
原因之二:考虑到表结构的变化,不利于程序的维护。

4.减少数据库访问的次数,这点符合“少读和少写原则”
原因:访问数据库解析是有代价的
例如:能用一条关联语句查询出来结果时,就不要分多条语句进行检索。

5.对于需要快速大批量的删除数据时,要使用TRUNCATE替代DELETE操作。

6.在使用like语句时,避免使用like '%abc'形式,否则无法使用到索引(对索引特殊处理除外)
原因:WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用。

7.不要在索引列上进行函数类的计算
原因:WHERE子句中,如果对索引列进行函数计算,优化器将不能有效的使用索引而选择全表扫描。
迂回的处理方法:如果确实要频繁的使用到函数操作,可以考虑在相应列上使用函数索引。

8.不要在索引列上使用IS NULL和IS NOT NULL做限制条件
原因:Oracle中的null在索引中是不记录的。

9.在索引列上可以考虑使用UNION代替OR运算符
原因:
使用UNION代替OR的方法从执行计划上来看,避免了FILTER操作,降低了一致性读(consistent gets),从而提高了SQL的运行效率。
如果操作的是索引列,更加推荐使用这样的替换方式,可以有效的提高SQL的执行效率,这也是OR运算符的一种很好的优化方法。
如果不是索引列,需要具体情况具体分析。
OR运算符的优化,有时也可以考虑通过IN的方式来限制,也可以不同程度的提高一些SQL的运行性能

10.第十点就是优化最最基本的原则——优化后达到“少读少写”的目的
通过执行计划等有效的工具来反复比较优化前和优化后对数据库的读写情况,往往优化后的共同特征就是让SQL能够尽量的少读数据库和少写数据库。

先列这10条,欢迎大家补充。

-- The End --

阅读(2389) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~

secooler2009-10-15 18:01:37

@leonstone 谢谢您的严谨,已做调整。

leonstone2009-10-15 17:48:18

逻辑读(consistent gets)是不是说成是一致读更好呢;)顺便把这两句贴过来了,供大家加深理解。 Logical reads is consistent gets + database block gets. Logical reads and physical reads are used to calculate the buffer cache hit ratio. session logical reads-->The sum of "db block gets" plus "consistent gets" .

michelle_it1682009-09-09 11:11:17

【SQL优化】SQL优化的10点注意事项这篇文章已被推荐到SQL Server生态圈圈子中。

评论热议
请登录后评论。

登录 注册