web-dev-qa-db-ja.com

特定のテーブル専用のリアルタイム統計Oracle 19cについて

従来の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

私は方法を見つけようとしましたが、うまくいきませんでした

1
gudisa veneeth

まず、アンダースコアパラメータは、サポートから指示された場合にのみ変更する必要があります。しかし、さらに重要なのは、これらのパラメーターの場合、リアルタイム統計は特定のデータベース製品でのみ利用できることです。詳細は ライセンスガイド を参照してください。

これらのパラメーターを変更すると、ライセンス契約に違反する可能性があります!

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操作のリアルタイム統計を取得することは非常にコストのかかる操作であることを知っているため

どうやってこれを知っていますか?

0
Chris Saxon