性能视图和性能参数

来源:互联网 发布:网络监控清单 编辑:程序博客网 时间:2024/05/16 13:46
性能视图和性能参数
一.性能视图
    性能视图是Oracle中一些记录数据库性能方面的视图,通过查看这些视图,获得数据库当前或历史上某个时间的性能数据。 它比SQL_TRACE,AWR报告获取数据更及时,便捷。
1.1 V$SQL
    V$SQL 视图是一个DBA 使用频率非常高的动态视图,它通常和V$SESSION 一起使用来获得当前会话的一些SQL执行情况。可以通过该视图查看正在执行的SQL语句及这条SQL运行了多长时间或者它正在等待什么样的事件。
 
1.1.1 用V$SQL 查看SQL 内容
    为了获取用户连接到数据库中的信息,需要先从V$SESSION视图确定用户的SID号,然后用v$session 和 v$sql查看相关信息。
    SQL>select * from v$session;
    从这里确定根据machine列和program列确定SID。
    根据SID 确定SQL:
SELECT a.sql_text, b.status, b.last_call_et, b.event
  FROM v$sql a, v$session b
 WHERE a.sql_id = b.sql_id
   AND b.sid = 23

1.1.2 用V$SQL 查看SQL执行和等待时间
对于已经执行完毕的会话,可以在V$SQL视图中找到它的执行时间和消耗的CPU时间,这些信息对我们分析一些性能上存在问题的SQL有用处。比如对比SQL 消耗的CPU 和执行时间,就可以大致知道SQL语句执行中是否有长时间的等待事件:

SELECT sql_text,
       cpu_time / (1000 * 1000) t_cpu,
       TRUNC(elapsed_time / (1000 * 1000)) t_elap,
       (cpu_time / elapsed_time / (1000 * 1000)) * 100 pct
  FROM v$sql
 WHERE sql_text LIKE ' insert into t%'
 
SQL> SELECT sql_text,
  2         cpu_time / (1000 * 1000) t_cpu,
  3         TRUNC(elapsed_time / (1000 * 1000)) t_elap,
  4         (cpu_time / elapsed_time / (1000 * 1000)) * 100 pct
  5    FROM v$sql
  6   WHERE sql_text LIKE '%insert into t1%';
 
SQL_TEXT                                                                              T_CPU     T_ELAP        PCT
-------------------------------------------------------------------------------- ---------- ---------- ----------
 insert into t1  select a.OBJECT_ID from all_objects a                             1.584324          1 9.38502174
 
返回如上结果,如果说T_ELAP 时间比较多,而CPU时间比较少,说明这条语句在执行过程中基本处于等待状态。

1.1.3 共享池中的SQL
    并不是所有的SQL语句都可以从V$SQL中找到,因为ORACLE会动态地更新共享池的信息,将一些过旧的SQL从共享池中删除,以便于新的SQL语句提供共享池的空间。
    SQL>alter system flush shared_pool;
    我们知道,SQL的解析的过程中,会把硬解析之后的SQL放在放在共享池中,如果我们清空了共享池,那么就需要重新做硬分析。
 
关于这点的验证,可以参考如下方法:
(1)开启SQL_TRACE
(2)做一条事务
(3)清空缓冲区
(4)在做同样的事务
(5)关闭SQL_TRACE
(6)用tkprof 查看trace文件,生成文件时加上aggregate=no参数,这样如果是一条SQL执行多次,在tkprof的trace文件中会分别列出来。 这个参数默认是YES。

1.1.4 我们可以通过vSsql查询到一条sql语句被执行和分析了多少次:
SQL> begin
       for i in 1 .. 100
         loop
           execute immediate 'select * from t';
       end loop;
       end;
     /
 
PL/SQL procedure successfully completed

SQL> select a.SQL_TEXT,a.PARSE_CALLS,a.EXECUTIONS from v$sql a where a.SQL_TEXT like'select * from t';
 
SQL_TEXT                                                                         PARSE_CALLS EXECUTIONS
-------------------------------------------------------------------------------- ----------- ----------
select * from t                                                                            1        100

新加:这里 PARSE_CALLS 包括硬件解析和软解析,如果全部相当也不要要紧,看看是不是软解。

我们可以看到,这条sql语句被分析了一次,并执行了100次,这在分析sql是否绑定变量的时候是非常有用的。
有关v$sql中各个列的详细信息,请参考oracle的官方文档《oracle database reference》。
 
1.2 V$SQL_SHARED_CURSOR
    官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3058.htm#REFRN30254
    这个视图存放了SQL在执行过程中游标共享的信息,它能帮助我们分析看起来一样的SQL,为什么没有共享的原因。
 
SQL> show parameter cursor_sharing;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
cursor_sharing                       string      EXACT
 
查看SQL:
SQL> select parsing_user_id puid,parsing_schema_id psid,sql_text,sql_id,child_address from v$sql where sql_text like ' insert into t1%';
 
      PUID       PSID SQL_TEXT                          SQL_ID        CHILD_ADDRESS
---------- ---------- ------------------------------ ------------- ----------------
        35         35  insert into t1 values(1)      avffcntks0dkm 00000000B3B28648
 
--- 如果这里有多条SQL_TEXT,SQL_ID相同的,就说明SQL没有重用。 我们可以用如下SQL来确定是哪里不一致造成:
 
查看不能重用原因:
SQL> declare
  2    a varchar2(1) :='x';
  3    b varchar2(100) :=rpad('x',100,'x');
  4    c varchar2(500) :=rpad('x',500,'x');
  5    d varchar2(1000) :=rpad('x',1000,'x');
  6    begin
  7      insert into t values(a);
  8      insert into t values(b);
  9      insert into t values(c);
 10      insert into t values(d);
 11    end;
 12  /
 
SQL> select a.PARSING_USER_ID,
  2         a.PARSING_SCHEMA_ID,
  3         a.SQL_TEXT,
  4         a.SQL_ID,
  5         a.CHILD_ADDRESS
  6    from v$sql a
  7   where a.SQL_TEXT like 'INSERT INTO T VALUES%';
 
PARSING_USER_ID PARSING_SCHEMA_ID SQL_TEXT                                                                         SQL_ID        CHILD_ADDRESS
--------------- ----------------- -------------------------------------------------------------------------------- ------------- ----------------
             35                35 INSERT INTO T VALUES(:B1 )                                                       9bay73nakuyw9 00000000BC142820
             35                35 INSERT INTO T VALUES(:B1 )                                                       9bay73nakuyw9 00000000BC1410A8
             35                35 INSERT INTO T VALUES(:B1 )                                                       9bay73nakuyw9 00000000BC140060
   
SQL> select * from v$sql_shared_cursor where sql_id='9bay73nakuyw9';
 
SQL_ID        ADDRESS          CHILD_ADDRESS    CHILD_NUMBER UNBOUND_CURSOR SQL_TYPE_MISMATCH OPTIMIZER_MISMATCH OUTLINE_MISMATCH STATS_ROW_MISMATCH LITERAL_MISMATCH SEC_DEPTH_MISMATCH EXPLAIN_PLAN_CURSOR BUFFERED_DML_MISMATCH PDML_ENV_MISMATCH INST_DRTLD_MISMATCH SLAVE_QC_MISMATCH TYPECHECK_MISMATCH AUTH_CHECK_MISMATCH BIND_MISMATCH DESCRIBE_MISMATCH LANGUAGE_MISMATCH TRANSLATION_MISMATCH ROW_LEVEL_SEC_MISMATCH INSUFF_PRIVS INSUFF_PRIVS_REM REMOTE_TRANS_MISMATCH LOGMINER_SESSION_MISMATCH INCOMP_LTRL_MISMATCH OVERLAP_TIME_MISMATCH SQL_REDIRECT_MISMATCH MV_QUERY_GEN_MISMATCH USER_BIND_PEEK_MISMATCH TYPCHK_DEP_MISMATCH NO_TRIGGER_MISMATCH FLASHBACK_CURSOR ANYDATA_TRANSFORMATION INCOMPLETE_CURSOR TOP_LEVEL_RPI_CURSOR DIFFERENT_LONG_LENGTH LOGICAL_STANDBY_APPLY DIFF_CALL_DURN BIND_UACS_DIFF PLSQL_CMP_SWITCHS_DIFF CURSOR_PARTS_MISMATCH STB_OBJECT_MISMATCH ROW_SHIP_MISMATCH PQ_SLAVE_MISMATCH TOP_LEVEL_DDL_MISMATCH MULTI_PX_MISMATCH BIND_PEEKED_PQ_MISMATCH MV_REWRITE_MISMATCH ROLL_INVALID_MISMATCH OPTIMIZER_MODE_MISMATCH PX_MISMATCH MV_STALEOBJ_MISMATCH FLASHBACK_TABLE_MISMATCH LITREP_COMP_MISMATCH
------------- ---------------- ---------------- ------------ -------------- ----------------- ------------------ ---------------- ------------------ ---------------- ------------------ ------------------- --------------------- ----------------- ------------------- ----------------- ------------------ ------------------- ------------- ----------------- ----------------- -------------------- ---------------------- ------------ ---------------- --------------------- ------------------------- -------------------- --------------------- --------------------- --------------------- ----------------------- ------------------- ------------------- ---------------- ---------------------- ----------------- -------------------- --------------------- --------------------- -------------- -------------- ---------------------- --------------------- ------------------- ----------------- ----------------- ---------------------- ----------------- ----------------------- ------------------- --------------------- ----------------------- ----------- -------------------- ------------------------ --------------------
9bay73nakuyw9 00000000B3F50EC0 00000000BC142820            0 N              N                 N                  N                N                  N                N                  N                   N                     N                 N                   N                 N                  N                   N             N                 N                 N                    N                      N            N                N                     N                         N                    N                     N                     N                     N                       N                   N                   N                N                      N                 N                    N                     N                     N              N              N                      N                     N                   N                 N                 N                      N                 N                       N                   N                     N                       N           N                    N                        N
9bay73nakuyw9 00000000B3F50EC0 00000000BC1410A8            1 N              N                 N                  N                N                  N                N                  N                   N                     N                 N                   N                 N                  N                   Y             N                 N                 N                    N                      N            N                N                     N                         N                    N                     N                     N                     N                       N                   N                   N                N                      N                 N                    N                     N                     N              N              N                      N                     N                   N                 N                 N                      N                 N                       N                   N                     N                       N           N                    N                        N
9bay73nakuyw9 00000000B3F50EC0 00000000BC140060            2 N              N                 N                  N                N                  N                N                  N                   N                     N                 N                   N                 N                  N                   Y             N                 N                 N                    N                      N            N                N                     N                         N                    N                     N                     N                     N                       N                   N                   N                N                      N                 N                    N                     N                     N              N              N                      N                     N                   N                 N                 N                      N                 N                       N                   N                     N                       N           N                    N                        N
 
如果这里有Y,就是导致不能重用的原因, 这些字母和V$SQL_SHARED_CURSOR 每个字段对应。

bind_mismatch,对比我们小例子,它的意思是游标之间的绑定变量的值上不一样,oracle认为这种不一致足以影响sql的执行计划,
所以不允许sql的重用。如果把变量长度变小,结果会如何呢。
SQL> alter system flush shared_pool;
 
System altered
 
SQL>
SQL> declare
  2    a varchar2(1) :='x';
  3    b varchar2(10) :=rpad('x',10,'x');
  4    c varchar2(20) :=rpad('x',20,'x');
  5    d varchar2(30) :=rpad('x',30,'x');
  6    begin
  7      insert into t values(a);
  8      insert into t values(b);
  9      insert into t values(c);
 10      insert into t values(d);
 11    end;
 12  /
 
PL/SQL procedure successfully completed
 
SQL>  select * from v$sql_shared_cursor where sql_id='9bay73nakuyw9';
 
SQL_ID        ADDRESS          CHILD_ADDRESS    CHILD_NUMBER UNBOUND_CURSOR SQL_TYPE_MISMATCH OPTIMIZER_MISMATCH OUTLINE_MISMATCH STATS_ROW_MISMATCH LITERAL_MISMATCH SEC_DEPTH_MISMATCH EXPLAIN_PLAN_CURSOR BUFFERED_DML_MISMATCH PDML_ENV_MISMATCH INST_DRTLD_MISMATCH SLAVE_QC_MISMATCH TYPECHECK_MISMATCH AUTH_CHECK_MISMATCH BIND_MISMATCH DESCRIBE_MISMATCH LANGUAGE_MISMATCH TRANSLATION_MISMATCH ROW_LEVEL_SEC_MISMATCH INSUFF_PRIVS INSUFF_PRIVS_REM REMOTE_TRANS_MISMATCH LOGMINER_SESSION_MISMATCH INCOMP_LTRL_MISMATCH OVERLAP_TIME_MISMATCH SQL_REDIRECT_MISMATCH MV_QUERY_GEN_MISMATCH USER_BIND_PEEK_MISMATCH TYPCHK_DEP_MISMATCH NO_TRIGGER_MISMATCH FLASHBACK_CURSOR ANYDATA_TRANSFORMATION INCOMPLETE_CURSOR TOP_LEVEL_RPI_CURSOR DIFFERENT_LONG_LENGTH LOGICAL_STANDBY_APPLY DIFF_CALL_DURN BIND_UACS_DIFF PLSQL_CMP_SWITCHS_DIFF CURSOR_PARTS_MISMATCH STB_OBJECT_MISMATCH ROW_SHIP_MISMATCH PQ_SLAVE_MISMATCH TOP_LEVEL_DDL_MISMATCH MULTI_PX_MISMATCH BIND_PEEKED_PQ_MISMATCH MV_REWRITE_MISMATCH ROLL_INVALID_MISMATCH OPTIMIZER_MODE_MISMATCH PX_MISMATCH MV_STALEOBJ_MISMATCH FLASHBACK_TABLE_MISMATCH LITREP_COMP_MISMATCH
------------- ---------------- ---------------- ------------ -------------- ----------------- ------------------ ---------------- ------------------ ---------------- ------------------ ------------------- --------------------- ----------------- ------------------- ----------------- ------------------ ------------------- ------------- ----------------- ----------------- -------------------- ---------------------- ------------ ---------------- --------------------- ------------------------- -------------------- --------------------- --------------------- --------------------- ----------------------- ------------------- ------------------- ---------------- ---------------------- ----------------- -------------------- --------------------- --------------------- -------------- -------------- ---------------------- --------------------- ------------------- ----------------- ----------------- ---------------------- ----------------- ----------------------- ------------------- --------------------- ----------------------- ----------- -------------------- ------------------------ --------------------
9bay73nakuyw9 00000000B3F50EC0 00000000BC13DBC8            0 N              N                 N                  N                N                  N                N                  N                   N                     N                 N                   N                 N                  N                   N             N                 N                 N                    N                      N            N                N                     N                         N                    N                     N                     N                     N                       N                   N                   N                N                      N                 N                    N                     N                     N              N              N                      N                     N                   N                 N                 N                      N                 N                       N                   N                     N                       N           N                    N                        N
 
我们看到,我们把变量长度减少为1、10、20、30时,oracle只有一个游标,所有的sql都被重用,因为这这情况下,oracle认为4个变量
在这样的差距范围是安全的,不会影响到sql的执行计划,所以重用了他们。
出了绑定变量的值会影响到游标的共享(sql重用)之外,还是很多的原因,比如不同的优化器环境下面的sql也不能被重用,
sql不能被重用的原因非常多,这个视图中列出了几十种导致sql不能被重用的情况,具体参考oracle官方文档《oracle database reference》中
关于v$sql_shared_cursor视图的描述。

1.3 V$SESSION
    官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3016.htm#REFRN30223
    我们可以从该视图查看用户会话的信息。可以使用machine或者module找到我们的用户。Macine 是客户端机器的名称,userName是会话连接时提供的用户名,Program是客户端执行程序的名称,module是Oracle 的存储过程DBMS_ALLPLCATION_INFO.SET_MODULE给出的执行程序的名称。
SQL> select a.MACHINE,a.USERNAME,a.PROGRAM,a.MODULE from v$session a;
 
MACHINE                                                          USERNAME                       PROGRAM                                          MODULE
---------------------------------------------------------------- ------------------------------ ------------------------------------------------ ------------------------------------------------
IM-8-201                                                         SYS                            sqlplus@IM-8-201 (TNS V1-V3)                     sqlplus@IM-8-201 (TNS V1-V3)
WORKGROUP\PC-201109282055                                        TEST                           plsqldev.exe                                     PL/SQL Developer
IM-8-201                                                                                        oracle@IM-8-201 (q001)                           
WORKGROUP\PC-201109282055                                        TEST                           plsqldev.exe                                  
    
这种直接查询v$session视图的方法只适合哪种两层结构的C-S架构,这种是客户端直接连接到数据库。 但是现在基本都是三层架构。 通过中间件如weblogic来连接数据库。 这种情况下就需要在中间件服务上进行跟踪,比如获得用户道和中间件的连接信息,然后根据中间件的信息或者日志来确定用户的最终信息。
V$SESSION 常用来查看用户当前的状态,当前执行的SQL语句,SQL语句执行时间,以及等待事件等。
V$SESSION 里面有个字段last_call_et(单位:秒),表示执行时间,这里有两种状态:
1.Session 处于active 状态,该字段表示session变成active到现在的时间;
2.Session处于inactive状态, 此时表示session 变成inactive到现在的时间。
 
示例1:查询active的session:
SQL> select status,last_call_et,event from v$session where sid=258;
 
STATUS   LAST_CALL_ET EVENT
-------- ------------ ----------------------------------------------------------------
ACTIVE              0 SQL*Net message from client
 
 
这里的9976 表示的从session变成inactive到现在的秒数。
示例2:查询inactive的session:
 
/* Formatted on 2010/9/6 16:52:32 (QP5 v5.115.810.9015) */
SELECT   a.sql_text,
         b.status,
         b.last_call_et,
         b.event
  FROM   v$sql a, v$session b
 WHERE   a.sql_id = b.sql_id AND b.sid = '258';
 SQL> SELECT   a.sql_text,
  2           b.status,
  3           b.last_call_et,
  4           b.event
  5    FROM   v$sql a, v$session b
  6   WHERE   a.sql_id = b.sql_id AND b.sid = '258';
 
SQL_TEXT                                                                         STATUS   LAST_CALL_ET EVENT
-------------------------------------------------------------------------------- -------- ------------ ----------------------------------------------------------------
 SELECT   a.sql_text,          b.status,          b.last_call_et,          b.eve ACTIVE              0 SQL*Net message from client
 
注意:
在RAC 状态下,会话需要来自不同的实例,所以在RAC 环境下需要使用GV$SESSION视图, 因为这个视图含有INST_ID 字段,通过这个字段可以区别实例。
 
1.4 V$SESSTAT
官网链接:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3027.htm#REFRN30232
这个视图记录了某个session从运行以来各种资源统计数据,通过关联表v$statname 可以查询出某个session的资源消耗情况,如:
SELECT   a.sid, b.name, a.VALUE
  FROM   v$sesstat a, v$statname b
 WHERE   a.sid = 23 AND a.statistic# = b.statistic#
         AND b.name IN
                  ('consistent gets',
                   'physical reads',
                   'parse count (total)',
                   'parse count (hard)');
 
       SID NAME                      VALUE
---------- -------------------- ----------
        23 consistent gets           29750
        23 physical reads              386
        23 parse count (total)         387
        23 parse count (hard)           82
 
这里显示了SID=23的session的信息。
 
 
1.5 V$SESSION_WAIT
官网链接地址:http://download.oracle.com/docs/cd/E11882_01/server.112/e10820/dynviews_3023.htm#REFRN30229
        
         V$SESSION_WAIT 记录了会话的一些等待信息,这些等待信息在v$session视图里可以可以查到。
 
示例:
         /* Formatted on 2010/9/6 17:19:40 (QP5 v5.115.810.9015) */
SELECT   event,
         p1,
         p1text,
         p2,
         p2text,
         p3,
         p3text,
         wait_time,
         seconds_in_wait,
         state
  FROM   v$session_wait
 WHERE   sid = 23;
 
关于等待事件参考Blog:    
                  Oracle 常见的33个等待事件
                   http://blog.csdn.net/tianlesoftware/archive/2010/08/12/5807800.aspx
 
 
 
二. 性能参数
         性能参数指它的设置会影响数据库性能问题的初始化参数。 这些参数比较多,具体参考ORACLE 官网文档。
 
2.1 CURSOR_SHARING
 
         该参数决定在什么情况下可以使用共享游标,即SQL重用。它有三个值: EXACT, SIMILAR 和FORCE.
 
默认情况下,oracle 将该参数值是EXACT. 意思是SQL必须绝对一样才能共享游标,否则将作为新的SQL语句处理。
         这种设置的意义在于,从Oracle层面来看,通过精确地匹配每个SQL语句,就可以保证只有语句完全相同的SQL,才可以在共享池中被重用,否则将作为新的SQL语句对待。 而把构造完全一样的SQL语句的任务留给用应用来完成,即由应用来通过变量绑定的方式达到SQL重用,而不是依赖ORACLE来实现,这样的好处是可以大大减少ORACLE花费在SQL分析上的资源消耗(cursor_sharing=similar),及避免Oracle不加判断地绑定变量导致执行计划选择的错误(cursor_sharing=force).
 
2.1.1 cursor_sharing=exact(默认值)
         这种情况下,只有SQL完全一样的,才会在共享池中重用SQL,我们可以使用绑定变量来实现SQL一样。但是在OLTP系统中,如果绑定变量的效果不太好,将CURSOR_SHARING设置为exact 就会增加Oracle 对SQL 的硬分析量,消耗更多的系统资源。 如果出现这种情况,cursor_sharing 就需要设置为其他的两个值。
 
2.1.2 cursor_sharing=similar
SQL> alter session set cursor_sharing=similar;
会话已更改。
SQL> select * from all_objects set_similar where object_id=10;
SQL> select * from all_objects set_similar where object_id=20;
SQL> select sql_text from v$sql where sql_text like '%set_similar%';
 
SQL_TEXT
------------------------------------------------------------------------------
select * from all_objects set_similar where object_id=:"SYS_B_0"
select * from all_objects set_similar where object_id=:"SYS_B_0"
 
如果你测试的结果不一样,把共享池清空一下就可以了:
         SQL> alter system flush shared_pool;
 
从这个结果看,当设置cursor_sharing=similar 时,Oracle会将SQL语句中的谓词条件用同一个名称的一个变量替代:SYS_B_0, 如果谓词中还有其他变量,将一次使用SYS_B_1,SYS_B_2. 这两条语句看起来一样,但是,Oracle 依然会把它们作为2条SQL语句来处理。
 
 
2.1.3 cursor_sharing=force
 
SQL> alter session set cursor_sharing=force;
SQL> select * from all_objects set_similar where object_id =2;
SQL> select * from all_objects set_similar where object_id =1;
SQL> select sql_text from v$sql where sql_text like '%set_similar%';
SQL_TEXT
--------------------------------------------------------------------------
select * from all_objects set_similar where object_id =:"SYS_B_0"
 
如果你测试的结果不一样,把共享池清空一下就可以了:
         SQL> alter system flush shared_pool;
 
         从上面的结果看,当设置cursor_sharing=force时,Oracle 会把这两条SQL语句的谓词用变量SYS_B_0代替,并且将它们看做同一条SQL语句来处理。
 
在OLTP系统才能使用绑定变量带来性能上的提升,因为在这样的系统中,SQL执行计划基本上是相同的,不会因为谓词的条件而改变。
而在OLAP系统中,因为OLAP系统中数据的变化非常大,列上的数据分布也可能很不均匀,这时候使用绑定变量,可能会出现问题。
按照Oracle 官方的说法,将参数值设置为EXACT是最优的。但是它的前提是需要通过应用程序绑定变量来达到最优的SQL重用。 只有高效的变量绑定,EXACT值才是最优的。而Similar和Force 是在系统没有使用绑定变量时,为了降低系统大量的SQL解析而使用的补救方法,但是它有很多问题,如不加区别或者略加区别的对谓词强制绑定变量,导致SQL的执行计划错误。
 
SIMILAR 和Force 的区别:
         Similar:如果CBO 发现被绑定变量的谓词还有其他执行计划可以选择,如果谓词条件的值有变化,就将会产生一个新的子游标,而不是重用之前的SQL语句;如果谓词没有其他的执行计划可选择,则忽略谓词的值,重用之前的SQL语句。
 
         Force: CBO和SQL 语句的所有谓词用变量替换,只做一次硬解析,之后所有的SQL都重用第一个SQL语句。
 
 
2.2 DB_FILE_MULTIBLOCK_READ_COUNT
         Oracle 在做一次连续的数据库扫描时,一次I/O 允许读取的最大数据块数,但有一个限制,就是每次I/O的大小不能超过Oracle 运行的操作系统的最大I/O值(通常是1M)。
         假设一张表有10240KB大小,数据块的大小为8kb,设置DB_FILE_MULTIBLOCK_READ_COUNT=32,那么我们对这张表做全表扫描的次数为:     10240/(32*8)=40次,即Oracle 对这张表做扫描需要花费40次I/O。 但是实际上,Oracle 花费的I/O次数可能大于这个值,可可能小于这个值。 因为Oracle在读多个数据库时,当内存中已经有了某个数据块时,Oracle 就不再从磁盘中读取它。
 
         对于OLTP数据库来说,每次用户读取的记录数非常少,这个值可以考虑设置的小一点;对于OLAP系统,因为查询的量非常大,所以可以考虑设置大一些。
 
注意: 多数据块读取操作只发生在一下两种情况:
(1)       FTS(FULL TABLE SCAN)
(2)       INDEX_FFS(INDEX FAST FULL SCAN)
 
 关于这两种连接方式,参考Blog:
Oracle 索引扫描的四种类型
http://blog.csdn.net/tianlesoftware/archive/2010/08/31/5852106.aspx
 
这个参数才10g R2版本后,Oracle不建议修改它的默认值。 当设置这个值为默认值时,Oracle 会通过收集SQL的I/O 情况,来动态设置这个参数的值,如果手工修改了它的默认值,Oracle 将确定使用这个新值。
         这个参数影响到CBO对成本的评估,通常来说,这个值设置的越大,FFS或者INDEX_FFS 得成本就会越低,执行计划就越向这面倾斜。
 


原创粉丝点击