CBOコストベースのオプティマイザ!
CBOコストベースのオプティマイザ:oracleにすべての実行計画に関する情報を取得させ、これらの情報を計算分析することで、最終的な実行計画として最もコストの低い実行計画を導出します.
前の例ではCBOの表現を見てみましょう
CBOオプティマイザには2つのオプションの運転モードがあります.
FIRST_ROWS(n):結果セットの前のnレコードを最も速い速度でフィードバックし、他の結果は同時に返す必要はありません.(ページングなどに適用)
ALL_ROWS:sqlを最速で実行し、結果セットをすべて返します.
OLAP(オンライン分析システム):データウェアハウスであり、ユーザー数が小さく、データ量が非常に大きく、長いトランザクションの操作である.
OLTP(オンライントランザクションシステム):ユーザーの同時多発数は多いが、データベースに対して小さな操作しか行わず、データベースはユーザーの操作に対する迅速な応答に重点を置いている.
OLT PデータベースのデフォルトオプティマイザがALL_であることがわかりますROWS
dbms_statsパッケージ:
前の例では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。