従来のDMLステートメントも含むようにオンライン統計収集(12c)を拡張するRegリアルタイム統計。リアルタイム統計は、オプティマイザがより最適な計画を生成するのに役立ちます。一括読み込み操作は、必要なすべての統計を収集しますが、リアルタイム統計は、従来の統計を置き換えるのではなく拡張します。
Oracleは新しいパラメータを導入しました
_optimizer_gather_stats_on_conventional_dml
および_optimizer_use_stats_on_conventional_dml
はデフォルトでtrueであり、_optimizer_stats_on_conventional_dml_sample_rate
100%
リアルタイム統計はどのように機能しますか?
デフォルトでは_optimizer_gather_stats_on_conventional_dml
はtrueなので、自動的に開始されます
DML操作が現在テーブルを変更している場合(従来)、上記のパラメーターがオンの場合、Oracle Databaseは最も重要な統計の値を動的に計算します。
挿入と行が多いテーブルの例を考えてみます。リアルタイム統計は、行が挿入されているときに増加する行数を追跡します。オプティマイザが新しいクエリのハード解析を実行する場合、オプティマイザはリアルタイム統計を使用して、より正確なコスト見積もりを取得できます。
USER_TAB_COL_STATISTICS
およびUSER_TAB_STATISITICS
列があります注は、リアルタイム統計が使用されたことを示します。 「STATS_ON_CONVENTIONAL_DML」。
実行計画ショー
|Id| Operation | Name|Rows|Bytes|Cost (%CPU)|Time| Pstart|Pstop|
---------------------------------------------------------------------------------------
| 0| INSERT STATEMENT | | | |910 (100)| | | |
| 1| LOAD TABLE CONVENTIONAL |SALES| | | | | | |
| 2| OPTIMIZER STATISTICS GATHERING | |918K| 25M|910 (2)|00:00:01| | |
| 3| PARTITION RANGE ALL | |918K| 25M|910 (2)|00:00:01| 1 | 28 |
| 4| TABLE ACCESS FULL |SALES|918K| 25M|910 (2)|00:00:01| 1 | 28 |
Also the explain plan in the query used will tell in note section
Note
-----
- dynamic statistics used: stats for conventional DML
LOAD TABLE CONVENTIONAL
およびOPTIMIZER STATISTICS GATHERING
は、この新機能の説明プランに追加された新しいパラメーターです。
can we apply real-time statistics only for a particular set of table . if yes, how can we achieve them ? , as we know getting real time statistics for any dml operation thats occuring for more that 100k rows is very costly operation
私は方法を見つけようとしましたが、うまくいきませんでした
まず、アンダースコアパラメータは、サポートから指示された場合にのみ変更する必要があります。しかし、さらに重要なのは、これらのパラメーターの場合、リアルタイム統計は特定のデータベース製品でのみ利用できることです。詳細は ライセンスガイド を参照してください。
これらのパラメーターを変更すると、ライセンス契約に違反する可能性があります!
LOAD TABLE CONVENTIONAL
およびOPTIMIZER STATISTICS GATHERING
は、この新機能の説明プランに追加された新しいパラメーターです。
これらの操作は、リアルタイム統計に固有のものではありません。 OPTIMIZER STATISTICS GATHERING
は、実行中に統計をキャプチャするすべての操作用です。 create table as select
は、これをしばらく行った例です。
LOAD TABLE CONVENTIONAL
は、データベースが従来の(直接パスではない)挿入を行うことを意味します。
次のリアルタイム統計を無効にできます。
no_gather_optimizer_statistics
ヒントを含む特定のステートメントたとえば、これらの3つの挿入の最初の挿入だけにOPTIMIZER STATISTICS GATHERING
操作があります。
set long 10000
set serveroutput off
cl scr
create table t as
select 1 c1 from dual
connect by level <= 100;
insert /*+ monitor */into t
with rws as (
select level x from dual
connect by level <= 10
)
select * from rws;
select dbms_sqltune.report_sql_monitor (report_level=> 'basic +plan')
from dual;
SQL Plan Monitoring Details (Plan Hash Value=2403765415)
======================================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Read | Read | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | Reqs | Bytes | (%) | (# samples) |
======================================================================================================================================================
| 0 | INSERT STATEMENT | | | | 1 | +0 | 1 | 0 | | | | |
| 1 | LOAD TABLE CONVENTIONAL | T | | | 1 | +0 | 1 | 0 | 4 | 32768 | | |
| 2 | OPTIMIZER STATISTICS GATHERING | | 1 | 2 | 1 | +0 | 1 | 10 | | | | |
| 3 | VIEW | | 1 | 2 | 1 | +0 | 1 | 10 | | | | |
| 4 | CONNECT BY WITHOUT FILTERING | | | | 1 | +0 | 1 | 10 | | | | |
| 5 | FAST DUAL | | 1 | 2 | 1 | +0 | 1 | 1 | | | | |
======================================================================================================================================================
insert /*+ monitor no_gather_optimizer_statistics */ into t
with rws as (
select level x from dual
connect by level <= 10
)
select * from rws;
select dbms_sqltune.report_sql_monitor (report_level=> 'basic +plan')
from dual;
SQL Plan Monitoring Details (Plan Hash Value=2403765415)
======================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | (%) | (# samples) |
======================================================================================================================================
| 0 | INSERT STATEMENT | | | | 1 | +0 | 1 | 0 | | |
| 1 | LOAD TABLE CONVENTIONAL | T | | | 1 | +0 | 1 | 0 | | |
| 2 | VIEW | | 1 | 2 | 1 | +0 | 1 | 10 | | |
| 3 | CONNECT BY WITHOUT FILTERING | | | | 1 | +0 | 1 | 10 | | |
| 4 | FAST DUAL | | 1 | 2 | 1 | +0 | 1 | 1 | | |
======================================================================================================================================
exec dbms_stats.lock_table_stats ( user, 'T' );
insert /*+ monitor */into t
with rws as (
select level x from dual
connect by level <= 10
)
select * from rws;
select dbms_sqltune.report_sql_monitor (report_level=> 'basic +plan')
from dual;
SQL Plan Monitoring Details (Plan Hash Value=2403765415)
======================================================================================================================================
| Id | Operation | Name | Rows | Cost | Time | Start | Execs | Rows | Activity | Activity Detail |
| | | | (Estim) | | Active(s) | Active | | (Actual) | (%) | (# samples) |
======================================================================================================================================
| 0 | INSERT STATEMENT | | | | 1 | +0 | 1 | 0 | | |
| 1 | LOAD TABLE CONVENTIONAL | T | | | 1 | +0 | 1 | 0 | | |
| 2 | VIEW | | 1 | 2 | 1 | +0 | 1 | 10 | | |
| 3 | CONNECT BY WITHOUT FILTERING | | | | 1 | +0 | 1 | 10 | | |
| 4 | FAST DUAL | | 1 | 2 | 1 | +0 | 1 | 1 | | |
======================================================================================================================================
100k行を超える行で発生するdml操作のリアルタイム統計を取得することは非常にコストのかかる操作であることを知っているため
どうやってこれを知っていますか?