oracle 性能调优之旅开始

1、先看三篇帖子:

www.itpub.net/thread-137600-1-1.html

http://www.itpub.net/thread-124424-1-1.html

http://blog.itpub.net/post/96/14353

执行下面的语句:

SQL> show parameter area_size;


NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------
bitmap_merge_area_size               integer     1048576
create_bitmap_area_size              integer     8388608
hash_area_size                       integer     131072
sort_area_size                       integer     65536
workarea_size_policy                 string      AUTO

我们只要知道一个问题,在这里sort_area_size=64K 和 hash_area_size=128K  是针对每个会话的,并不是针对整个数据库的。

1G内存的服务器上,内给到400--500M 给SGA。。2G 能给到1G; 8G 能给到5G。。通常用一个参考的公式来表达这个问题:

os使用内存+SGA+并发进程数*(sort_area_size+hash_area_size+2M) < 0.7* 总内存

不过现在10g ,11g中先后推出了SGA自动管理,内存自动管理。基本不用dba手动设置了。。


2、一个调优的案例分析

这个看了书上的一个调优的案例,总结出来的,具体的内容没有写(参照《oracle数据库性能优化》盖国强等著P69),主要是想同个自己看的第一个例子,来熟悉一般的调优过程。

问题表述:应用是一个后台新闻发布系统,前端展现的是一个大型网站。java开发应用,通过中间件连接池连接数据库。通过连接访问新闻网页极其缓慢,后台发布管理具有同样的问题。通常需要十几秒才能返回。这种性能是用户不能忍受的。

解决过程:

1、检查并跟踪数据库进程:在前台单击相关的新闻条目页面,同时进行后台进程跟踪。

SQL> select sid ,serial# ,username from v$session;

    SID    SERIAL# USERNAME
------- ---------- ------------------
    135      21065
    137      13248 SYS
    141       1793
    147        157
    157          1
    159          3
    160          9
    162       9589
    163          1
    164          1
    165          1


    SID    SERIAL# USERNAME
------- ---------- ------------------
    166          1
    167          1
    168          1
    169          1
    170          1

除了sys及后台进程外,其他的使我们诊断的目标,要对几个进程启用相关的进程SQL_TRACE

SQL>exec dbms_system.set_sql_trace_in_session(sid, serial#,,true);

.......

在这里要跟踪不止一个后台的进程,反正只要认为可疑的进程都要跟踪的。此时,前台的页面进行刷新,等待一段时间。然后关闭SQL_TRACE

SQL>exec dbms_system.set_sql_trace_in_session(sid, serial#,,false);

2、检查TRACE文件:在udump目录下找到相应的跟踪文件,用tkprof工具查看。看到有一个问题,经过了3892次查询,才查询出一条对应的数据记录。在执行计划里,看到这条语句用的全表扫描。(现在要思考为什么不是走的索引?)

3、登陆数据库检查相应的表结构:发现每次查询所用的articleid 列 有索引,但是没有被用到

。为什么呢?检查表结构发现 articleid列时 VARCHAR2类型的数据。而我们查询时,articleid=20224456565这是一个数值的类型。Oracle在执行这个sql查询时,发生了潜在的数据类型转换(把表中的article转换为 number类型,然后和20224456565这个值比较,相同则取出。)很明显,这样需要全表的转换,执行了全表的扫描。。

4、解决办法:解决的办法超级简单,只需要在查询语句中数字两侧加上引单号:articleid=’ 20224456565 ‘ 对于用单引号引起来的数字,oracle会认为是字符串、这样就消除了隐式类型的转换。再次查询,只需要查询2次,即可查询出一行。问题解决。

 






































上一篇:cacti + squid


下一篇:oracle exp 常见错误 EXP-00091