我现在在做一个项目,这个项目的数据量很大,而且表也很大,字段也很多,查询条件也是很多的。现在查询起来很慢,优化sql语句是一方面。现在应该怎么优化oracle数据库啊。我把我的oracle数据库的一些参数发出来高手看看怎么优化。这个是执行SELECT NAME,VALUE FROM v$parameter WHERE NAME IN
('sga_max_size','db_cache_size',
'shared_pool_size','shared_pool_reserved_size','large_pool_size','java_pool_size',
'db_block_size','db_block_buffers','log_buffer','sort_area_size','sort_area_retained_size',
'hash_area_size','sessions','open_cursors'
) ORDER BY NAME;执行结果:
1 db_block_buffers 0
2 db_block_size 8192
3 db_cache_size 205520896
4 hash_area_size 131072
5 java_pool_size 54525952
6 large_pool_size 54525952
7 log_buffer 7024640
8 open_cursors 300
9 sessions 170
10 shared_pool_reserved_size 9437184
11 shared_pool_size 188743680
12 sort_area_retained_size 0
13 sort_area_size 65536这写参数,应该怎么优化数据库啊!高手指点 
最好附上代码…… 谢谢

解决方案 »

  1.   

    oracle 10g的数据库 ,这个项目都是查询。没有insert 和update 。帮忙优化
      

  2.   

    NAME                                                                             VALUE
    -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
    db_block_buffers                                                                 0
    db_block_size                                                                    16384
    db_cache_size                                                                    1056964608
    hash_area_size                                                                   28000000
    java_pool_size                                                                   67108864
    large_pool_size                                                                  16777216
    log_buffer                                                                       7000064
    open_cursors                                                                     400
    sessions                                                                         335
    sga_max_size                                                                     2147483648
    shared_pool_reserved_size                                                        104857600
    shared_pool_size                                                                 536870912
    sort_area_retained_size                                                          0
    sort_area_size                                                                   6553614 rows selected
      

  3.   

    1. (15) 用EXISTS替代IN、用NOT EXISTS替代NOT IN: 
    在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 
    例子: 
    (高效)SELECT * FROM  EMP (基础表)  WHERE  EMPNO > 0  AND  EXISTS (SELECT ‘X'  FROM DEPT  WHERE  DEPT.DEPTNO = EMP.DEPTNO  AND  LOC = ‘MELB') 
    (低效)SELECT  * FROM  EMP (基础表)  WHERE  EMPNO > 0  AND  DEPTNO IN(SELECT DEPTNO  FROM  DEPT  WHERE  LOC = ‘MELB') 
    SQL优化建议34条 
    http://user.qzone.qq.com/251097186/blog/1247125222
    2. 对于大的表的操作, 如果表非常大,最好考虑建分区表,这样能提高读取速度,同时要在相应的字段上建索引或者分区索引Oracle 分区表
    http://user.qzone.qq.com/251097186/blog/1246510947Oracle 分区表维护
    http://user.qzone.qq.com/251097186/blog/1253262830
    3. 建好后用EXPLAIN plan 来分析下SQL语句,看看cost是多少,一般cost是越少约好.
      用Toad,pl sql dev等工具查看比较方便,当然在sqlplus中也可以:SQLPLUS 里执行 EXPLAIN PLAN 
    SQL>EXPLAIN PLAN FOR 你的sql语句; 
    eg:SQL>EXPLAIN PLAN FOR SELECT * FROM EMP WHERE EMPNO=7369; 
    然后 
    SELECT plan_table_output 
      FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE')); 
      

  4.   


    对于数据库的调整,做个AWR分析下数据库, 在根据相应的参数来修改,楼主贴出现在的参数是没有多少价值的..
    AWR使用 
    SQL>@?/rdbms/admin/awrrpt.sql Specify the Report Type 
    ~~~~~~~~~~~~~~~~~~~~~~~ 
    Would you like an HTML report, or a plain text report? 
    Enter 'html' for an HTML report, or 'text' for plain text 
    Defaults to 'html' 
    输入 report_type 的值:   
    Type Specified:  html 
    Specify the number of days of snapshots to choose from 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    Entering the number of days (n) will result in the most recent 
    (n) days of snapshots being listed.  Pressing <return> without 
    specifying a number lists all completed snapshots. 
    输入 num_days 的值:  1 
    Listing the last day's Completed Snapshots 
                                                            Snap 
    Instance     DB Name        Snap Id    Snap Started    Level 
    ------------ ------------ --------- ------------------ ----- 
    orcl10g      ORCL10G            142 03 7月  2009 08:11     1 
                                    143 03 7月  2009 09:00     1 
                                    144 03 7月  2009 10:00     1 
                                    145 03 7月  2009 11:00     1 
                                    146 03 7月  2009 12:01     1 
    Specify the Begin and End Snapshot Ids 
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    输入 begin_snap 的值:  142 
    Begin Snapshot Id specified: 142 
    输入 end_snap 的值:  146 
    End   Snapshot Id specified: 146 
    Specify the Report Name 
    ~~~~~~~~~~~~~~~~~~~~~~~ 
    The default report file name is awrrpt_1_142_146.html.  To use this name, 
    press <return> to continue, otherwise enter an alternative. 
    输入 report_name 的值:  D:\awrrpt_1_142_146.html 
    Report written to D:\awrrpt_1_142_146.html