ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 依据统计信息确定多块读被使用

依据统计信息确定多块读被使用

原创 Linux操作系统 作者:dragondb 时间:2019-07-14 15:06:04 0 删除 编辑

大家都知道:Full table scan 和 Index fast full scan会用到多块读,下面就依据统计信息来确定这点;

physical read total multi block requests:

Total number of Oracle instance read requests which read in two or more database blocks per request for all instance activity including application, backup and recovery, and other utilities

SQL> create table test as select * from all_objects ;

Table created.

SQL> select b.name,a.value
  2  from v$mystat a
  3      ,v$statname b
  4  where a.statistic# = b.STATISTIC#
  5    and b.NAME = 'physical read total multi block requests';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
physical read total multi block requests                                 13

SQL> select count(*) from test;

  COUNT(*)
----------
     67711

SQL> select b.name,a.value
  2  from v$mystat a
  3      ,v$statname b
  4  where a.statistic# = b.STATISTIC#
  5    and b.NAME = 'physical read total multi block requests';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
physical read total multi block requests                                 21

SQL> set autot on explain;
SQL> select count(*) from test;

  COUNT(*)
----------
     67711


Execution Plan
----------------------------------------------------------
Plan hash value: 1950795681

-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |   279   (1)| 00:00:04 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| TEST | 67192 |   279   (1)| 00:00:04 |
-------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

SQL>

Full table scan 导致多块读请求增加了8

SQL> create index test_idx_01 on test(object_id);

Index created.

SQL> select b.name,a.value
  2  from v$mystat a
  3      ,v$statname b
  4  where a.statistic# = b.STATISTIC#
  5    and b.NAME = 'physical read total multi block requests';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
physical read total multi block requests                                 21

SQL> select count(*) from test;

  COUNT(*)
----------
     67711

SQL> select b.name,a.value
  2  from v$mystat a
  3      ,v$statname b
  4  where a.statistic# = b.STATISTIC#
  5    and b.NAME = 'physical read total multi block requests';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
physical read total multi block requests                                 22

SQL> set autot on explain ;
SQL> select count(*) from test;

  COUNT(*)
----------
     67711


Execution Plan
----------------------------------------------------------
Plan hash value: 2827309063

-----------------------------------------------------------------------------
| Id  | Operation             | Name        | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |             |     1 |    46   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE       |             |     1 |            |          |
|   2 |   INDEX FAST FULL SCAN| TEST_IDX_01 | 67192 |    46   (0)| 00:00:01 |
-----------------------------------------------------------------------------

Note
-----
   - dynamic sampling used for this statement

SQL>

Index fast full scan导致多块读请求增加了1

SQL> create index test_idx_02 on test(object_type);

Index created.

SQL> select b.name,a.value
  2  from v$mystat a
  3      ,v$statname b
  4  where a.statistic# = b.STATISTIC#
  5    and b.NAME = 'physical read total multi block requests';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
physical read total multi block requests                                 22

SQL> select count(*) from test where object_type='TABLE';

  COUNT(*)
----------
      2622

SQL> select b.name,a.value
  2  from v$mystat a
  3      ,v$statname b
  4  where a.statistic# = b.STATISTIC#
  5    and b.NAME = 'physical read total multi block requests';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
physical read total multi block requests                                 22

SQL> set autot on explain;
SQL> select count(*) from test where object_type='TABLE';

  COUNT(*)
----------
      2622


Execution Plan
----------------------------------------------------------
Plan hash value: 2071593684

---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |     1 |    11 |     9   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |             |     1 |    11 |            |          |
|*  2 |   INDEX RANGE SCAN| TEST_IDX_02 |  2787 | 30657 |     9   (0)| 00:00:01 |
---------------------------------------------------------------------------------

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

   2 - access("OBJECT_TYPE"='TABLE')

Note
-----
   - dynamic sampling used for this statement

SQL>

Index range scan没有发出多块读请求;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/45259/viewspace-663191/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: PL/SQL集合类型
请登录后发表评论 登录
全部评论

注册时间:2003-05-05

  • 博文量
    98
  • 访问量
    94094