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;

  • 相关阅读:
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(4)
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(3)
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(2)
    MongoDB-JAVA-Driver 3.2版本常用代码全整理(1)
    c++清除输入缓冲区之 sync() vs ignore()
    typedef 类型重命名 和 #define 宏定义(1)
    从gcc的__attribute__((packed))聊到结构体大小的问题
    对于volatile的理解
    把一个string串的所有小写字母转成大写字母的例子来看看看全局函数的使用
    string与char* 互相转换以及周边问题
  • 原文地址:https://www.cnblogs.com/lfree/p/8579279.html
Copyright © 2011-2022 走看看