zoukankan      html  css  js  c++  java
  • [20180316]共享服务模式和直接路径读.txt

    [20180316]共享服务模式和直接路径读.txt

    --//在共享服务器模式下,执行计划不会选择直接路径读,通过例子证明.

    1.环境:
    SYS@book> @ &r/ver1
    PORT_STRING          VERSION    BANNER
    -------------------- ---------- ----------------------------------------------------------------------------
    x86_64/Linux 2.4.xx  11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

    SYS@book> alter system set filesystemio_options=asynch scope=spfile;
    System altered.

    --//重启数据库.

    SCOTT@book> show sga
    Total System Global Area  634732544 bytes
    Fixed Size                  2255792 bytes
    Variable Size             197133392 bytes
    Database Buffers          427819008 bytes
    Redo Buffers                7524352 bytes

    SCOTT@book> create table t as select rownum id from dual connect by level<=2;
    Table created.

    SCOTT@book> ALTER TABLE t MINIMIZE RECORDS_PER_BLOCK ;
    Table altered.
    --//这样可以实现每块2条记录.

    SCOTT@book> insert into t select rownum+2 from dual connect by level <=8e4-2;
    79998 rows created.

    SCOTT@book> commit ;
    Commit complete.

    --//分析表略.

    SCOTT@book> select OWNER,SEGMENT_NAME,SEGMENT_TYPE,HEADER_FILE,HEADER_BLOCK,BYTES,BLOCKS from dba_segments where owner=user and segment_name='T';
    OWNER  SEGMENT_NAME         SEGMENT_TYPE       HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS
    ------ -------------------- ------------------ ----------- ------------ ---------- ----------
    SCOTT  T                    TABLE                        4          546  333447168      40704

    --//占用 333447168/1024/1024 = 318M


    SCOTT@book> select object_id,data_object_id from dba_objects where owner=user and object_name='T';
     OBJECT_ID DATA_OBJECT_ID
    ---------- --------------
         90467          90467

    SCOTT@book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
         36020
        
    2.测试分析:
    SCOTT@book> alter system flush buffer_cache;
    System altered.

    SCOTT@book> alter session set statistics_level=all;
    Session altered.

    SCOTT@book> @ &r/spid
           SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
    ---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
           274         11 46995                    DEDICATED 46996       21          6 alter system kill session '274,11' immediate;

    --//server=DEDICATED采用专用模式.

    SCOTT@book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
             0

    SCOTT@book> @ &r/viewsess "physical reads direct"
    NAME                                       STATISTIC#      VALUE        SID
    ------------------------------------------ ---------- ---------- ----------
    physical reads direct                              97          0        274
    physical reads direct temporary tablespace        110          0        274
    physical reads direct (lob)                       176          0        274

    SCOTT@book> select count(*) from t;
      COUNT(*)
    ----------
         80000

    SCOTT@book> @ &r/viewsess "physical reads direct"
    NAME                                       STATISTIC#      VALUE        SID
    ------------------------------------------ ---------- ---------- ----------
    physical reads direct                              97      40217        274
    physical reads direct temporary tablespace        110          0        274
    physical reads direct (lob)                       176          0        274

    --//可以发现执行计划走的physical reads direct.physical reads direct=40217.通过执行后数据缓存数量也可以推定:

    SCOTT@book> alter system flush buffer_cache;
    System altered.

    SCOTT@book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
             0

    SCOTT@book> select count(*) from t;
      COUNT(*)
    ----------
         80000

    SCOTT@book> @ &r/dpc '' ''
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  cyzznbykb509s, child number 0
    -------------------------------------
    select count(*) from t
    Plan hash value: 2966233522
    ----------------------------------------------------------------------------------------------------------------------
    | Id  | Operation          | Name | Starts | E-Rows | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
    ----------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |      1 |        | 10963 (100)|          |      1 |00:00:00.17 |   40227 |  40222 |
    |   1 |  SORT AGGREGATE    |      |      1 |      1 |            |          |      1 |00:00:00.17 |   40227 |  40222 |
    |   2 |   TABLE ACCESS FULL| T    |      1 |  89876 | 10963   (1)| 00:02:12 |  80000 |00:00:00.17 |   40227 |  40222 |
    ----------------------------------------------------------------------------------------------------------------------
    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------
       1 - SEL$1
       2 - SEL$1 / T@SEL$1

    Note
    -----
       - dynamic sampling used for this statement (level=2)

    SCOTT@book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
             5
    --//仅仅缓存5个数据块.

    3.测试分析:
    $ rlsql scott/book@127.0.0.1:1521/book

    --//我以前多次提到dispatchers包括服务.ezconenct优先使用共享服务器模式:

    SCOTT@127.0.0.1:1521/book> show parameter dispatchers
    NAME            TYPE     VALUE
    --------------- -------- -------------------------------------
    dispatchers     string   (PROTOCOL=TCP) (SERVICE=book,bookXDB)
    max_dispatchers integer

    SCOTT@127.0.0.1:1521/book>  alter session set statistics_level=all;
    Session altered.

    SCOTT@127.0.0.1:1521/book> alter system flush buffer_cache;
    System altered.

    SCOTT@127.0.0.1:1521/book> @ &r/spid
           SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
    ---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
           261          1 47005                    SHARED    46300       20          1 alter system kill session '261,1' immediate;

    --//server=SHARED,采用共享服务器模式.

    SCOTT@127.0.0.1:1521/book> @ &r/viewsess "physical reads direct"
    NAME                                       STATISTIC#      VALUE        SID
    ------------------------------------------ ---------- ---------- ----------
    physical reads direct                              97          0        261
    physical reads direct temporary tablespace        110          0        261
    physical reads direct (lob)                       176          0        261

    SCOTT@127.0.0.1:1521/book> select count(*) from t;
      COUNT(*)
    ----------
         80000

    SCOTT@127.0.0.1:1521/book> @ &r/viewsess "physical reads direct"
    NAME                                                                   STATISTIC#      VALUE        SID
    ---------------------------------------------------------------------- ---------- ---------- ----------
    physical reads direct                                                          97          0        261
    physical reads direct temporary tablespace                                    110          0        261
    physical reads direct (lob)                                                   176          0        261

    --//可以发现在共享服务器模式下执行计划不选择直接路径读.通过缓存数量也可以证明:
    SCOTT@127.0.0.1:1521/book> alter system flush buffer_cache;
    System altered.

    SCOTT@127.0.0.1:1521/book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
             0
    SCOTT@127.0.0.1:1521/book> select count(*) from t;
      COUNT(*)
    ----------
         80000

    SCOTT@127.0.0.1:1521/book> @ &r/dpc '' ''
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  cyzznbykb509s, child number 0
    -------------------------------------
    select count(*) from t
    Plan hash value: 2966233522
    ----------------------------------------------------------------------------------------------------------------------
    | Id  | Operation          | Name | Starts | E-Rows | Cost (%CPU)| E-Time   | A-Rows |   A-Time   | Buffers | Reads  |
    ----------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |      |      1 |        | 10963 (100)|          |      1 |00:00:00.34 |   40236 |  40222 |
    |   1 |  SORT AGGREGATE    |      |      1 |      1 |            |          |      1 |00:00:00.34 |   40236 |  40222 |
    |   2 |   TABLE ACCESS FULL| T    |      1 |  89876 | 10963   (1)| 00:02:12 |  80000 |00:00:00.34 |   40236 |  40222 |
    ----------------------------------------------------------------------------------------------------------------------
    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------
       1 - SEL$1
       2 - SEL$1 / T@SEL$1
    Note
    -----
       - dynamic sampling used for this statement (level=2)

    SCOTT@127.0.0.1:1521/book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
         40222
    --//全表扫描后数据块大量进入数据缓存.

    3.但是在并行的情况下共享模式情况就不同:

    SCOTT@127.0.0.1:1521/book> @ &r/spid
           SID    SERIAL# PROCESS                  SERVER    SPID       PID  P_SERIAL# C50
    ---------- ---------- ------------------------ --------- ------ ------- ---------- --------------------------------------------------
           261          1 47005                    SHARED    46300       20          1 alter system kill session '261,1' immediate;

    SCOTT@127.0.0.1:1521/book> alter system flush buffer_cache;
    System altered.

    SCOTT@127.0.0.1:1521/book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
             0

    SCOTT@127.0.0.1:1521/book> @ &r/viewsess "physical reads direct"
    NAME                                                                   STATISTIC#      VALUE        SID
    ---------------------------------------------------------------------- ---------- ---------- ----------
    physical reads direct                                                          97          0        261
    physical reads direct temporary tablespace                                    110          0        261
    physical reads direct (lob)                                                   176          0        261

    SCOTT@127.0.0.1:1521/book> select /*+ parallel(t 8) */ count(*) from t;
      COUNT(*)
    ----------
         80000

    SCOTT@127.0.0.1:1521/book> @ &r/dpc '' ''
    PLAN_TABLE_OUTPUT
    -------------------------------------
    SQL_ID  965gv5rh77t0c, child number 0
    -------------------------------------
    select /*+ parallel(t 8) */ count(*) from t
    Plan hash value: 3126468333

    --------------------------------------------------------------------------------------------------------------------------------------------------
    | Id  | Operation              | Name     | Starts | E-Rows | Cost (%CPU)| E-Time   |    TQ  |IN-OUT| PQ Distrib | A-Rows |   A-Time   | Buffers |
    --------------------------------------------------------------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT       |          |      1 |        |  1522 (100)|          |        |      |            |      1 |00:00:00.22 |      15 |
    |   1 |  SORT AGGREGATE        |          |      1 |      1 |            |          |        |      |            |      1 |00:00:00.22 |      15 |
    |   2 |   PX COORDINATOR       |          |      1 |        |            |          |        |      |            |      8 |00:00:00.22 |      15 |
    |   3 |    PX SEND QC (RANDOM) | :TQ10000 |      0 |      1 |            |          |  Q1,00 | P->S | QC (RAND)  |      0 |00:00:00.01 |       0 |
    |   4 |     SORT AGGREGATE     |          |      0 |      1 |            |          |  Q1,00 | PCWP |            |      0 |00:00:00.01 |       0 |
    |   5 |      PX BLOCK ITERATOR |          |      0 |  89876 |  1522   (0)| 00:00:19 |  Q1,00 | PCWC |            |      0 |00:00:00.01 |       0 |
    |*  6 |       TABLE ACCESS FULL| T        |      0 |  89876 |  1522   (0)| 00:00:19 |  Q1,00 | PCWP |            |      0 |00:00:00.01 |       0 |
    --------------------------------------------------------------------------------------------------------------------------------------------------

    Query Block Name / Object Alias (identified by operation id):
    -------------------------------------------------------------

       1 - SEL$1
       6 - SEL$1 / T@SEL$1

    Predicate Information (identified by operation id):
    ---------------------------------------------------

       6 - access(:Z>=:Z AND :Z<=:Z)

    Note
    -----
       - dynamic sampling used for this statement (level=2)

    SCOTT@127.0.0.1:1521/book> @ &r/viewsess "physical reads direct"
    NAME                                       STATISTIC#      VALUE        SID
    ------------------------------------------ ---------- ---------- ----------
    physical reads direct                              97      40217        261
    physical reads direct temporary tablespace        110          0        261
    physical reads direct (lob)                       176          0        261

    --//可以发现physical reads direct上升.

    SCOTT@127.0.0.1:1521/book> select count(*) from v$bh where OBJD=90467 and STATUS<>'free';
      COUNT(*)
    ----------
           314
    --//从数据缓存的数量也可以看出.

    4.附上viewsess.sql脚本:
    set verify off
    column name format a70
    SELECT b.NAME, a.statistic#, a.VALUE,a.sid
      FROM v$mystat a, v$statname b
     WHERE lower(b.NAME) like lower('%&1%') AND a.statistic# = b.statistic# ;
     --and a.value>0;

  • 相关阅读:
    java编译错误No enclosing instance of type TestFrame is accessible. Must qualify the allocation with an enclosing instance of type TestFrame (e.g. x.new A(
    java 2中创建线程方法
    动态规划基本思想
    关于eclipse编译一个工程多个main函数
    java Gui初识
    Eclipse中java项目的打包
    java 播放声音
    把资源文件夹导入到eclipse中
    Java建立JProgressBar
    How to grant permissions to a custom assembly that is referenced in a report in Reporting Services
  • 原文地址:https://www.cnblogs.com/lfree/p/8579279.html
Copyright © 2011-2022 走看看