CBOコストベースのオプティマイザ!


CBOコストベースのオプティマイザ:oracleにすべての実行計画に関する情報を取得させ、これらの情報を計算分析することで、最終的な実行計画として最もコストの低い実行計画を導出します.
前の例ではCBOの表現を見てみましょう
SQL> select /*+ all_rows */ * from t where id = 1;

   50600 。


    
----------------------------------------------------------
Plan hash value: 1601196873

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      | 47385 |  3655K|    56   (4)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    | 47385 |  3655K|    56   (4)| 00:00:01 |
--------------------------------------------------------------------------

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

   1 - filter("ID"=1)

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


    
----------------------------------------------------------
          9  recursive calls
          0  db block gets
       3649  consistent gets
          0  physical reads
          0  redo size
    1510200  bytes sent via SQL*Net to client
      37503  bytes received via SQL*Net from client
       3375  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
      50600  rows processed

SQL> select /*+ all_rows */ * from t where id = 99;


    
----------------------------------------------------------
Plan hash value: 4013845416

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |    79 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T     |     1 |    79 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | IND_T |     1 |       |     1   (0)| 00:00:01 |
-------------------------------------------------------------------------------------

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

   2 - access("ID"=99)

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


    
----------------------------------------------------------
          7  recursive calls
          0  db block gets
         67  consistent gets
          0  physical reads
          0  redo size
        473  bytes sent via SQL*Net to client
        400  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed
CBOは正しい実行計画を立てた:id=1、全表スキャン;id=99、インデックススキャン.
CBOオプティマイザには2つのオプションの運転モードがあります.
FIRST_ROWS(n):結果セットの前のnレコードを最も速い速度でフィードバックし、他の結果は同時に返す必要はありません.(ページングなどに適用)
ALL_ROWS:sqlを最速で実行し、結果セットをすべて返します.
OLAP(オンライン分析システム):データウェアハウスであり、ユーザー数が小さく、データ量が非常に大きく、長いトランザクションの操作である.
OLTP(オンライントランザクションシステム):ユーザーの同時多発数は多いが、データベースに対して小さな操作しか行わず、データベースはユーザーの操作に対する迅速な応答に重点を置いている.
OLT PデータベースのデフォルトオプティマイザがALL_であることがわかりますROWS
SQL> conn /as sysdba
   。
SQL> show parameter optimizer_mode

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
optimizer_mode                       string      ALL_ROWS

dbms_statsパッケージ:
exec dbms_stats.gather_table_stats(ownname=>'u1',tabname=>'t',cascade=>true);
exec dbms_stats.gather_index_stats(ownname=>'u1',indname=>'ind_t');
exec dbms_stats.gather_schema_stats(ownname=>'u1',options=>'gather auto');
options    :
gather	——        (Schema)。 
gather empty	——            。 
gather stale	——          10%  (        、     )。 
gather auto	——             ,        (  )   。
  ,  gather auto       gather stale gather empty。