この章では、オプティマイザ統計管理に関する基本タスクについて説明します。
この章の内容は次のとおりです。
関連項目:
オプティマイザ統計に関連する概念およびタスクの詳細は、「オプティマイザ統計の管理: 高度なトピック」を参照してください。
Oracle Databaseでは、オプティマイザ統計収集とは、固定オブジェクトを含む、データベース・オブジェクトのオプティマイザ統計を収集することです。
データベースには、オプティマイザ統計が自動的に収集されます。DBMS_STATS
パッケージを使用して、手動で収集することもできます。
表の内容および関連付けられた索引が頻繁に変更されると、オプティマイザによって最適ではない問合せの実行計画が選択される可能性があります。パフォーマンスの問題が発生する可能性を回避するには、統計を最新に保つ必要があります。
DBAの介入を最小化するために、Oracleデータベースでは、様々なタイミングでオプティマイザ統計が自動収集されます。AutoTaskを有効化してDBMS_STATS
を実行するなど、一部の自動オプションは構成が可能です。
Oracle Enterprise Manager Cloud Control(Cloud Control)またはコマンドラインのPL/SQLのいずれかを使用してオプティマイザ統計を管理できます。
Cloud Controlの「オプティマイザ統計の管理」ページは、オプティマイザ統計の管理が可能なGUIです。
Oracle Enterprise Manager Cloud Controlでは、GUIベースの単一フレームワーク内で複数のデータベースを管理できます。
Cloud Controlを使用してデータベース・ホーム・ページにアクセスする手順は次のとおりです。
適切な資格証明を使用してCloud Controlにログインします。
「ターゲット」メニューの下で、「データベース」を選択します。
データベース・ターゲットのリストで、管理対象のOracle Databaseインスタンスのターゲットを選択します。
データベースの資格証明の入力を求められた場合は、実行するタスクに必要な最小限の資格証明を入力します。
関連項目:
Cloud Controlオンライン・ヘルプ
このトピックでは、オプティマイザ統計を自動的に収集するようにOracle Databaseを構成する方法について説明します。
この項の内容は次のとおりです。
自動化メンテナンス・タスク・インフラストラクチャ(AutoTask)は、メンテナンス・ウィンドウと呼ばれるOracle Schedulerウィンドウで自動的に実行するタスクをスケジュールします。
デフォルトでは、1つのウィンドウが週の各曜日にスケジュールされます。自動オプティマイザ統計収集はAutoTaskの一部として実行されます。この収集は、デフォルトでは事前に定義されたすべてのメンテナンス・ウィンドウで実行されます。
注意:
自動オプティマイザ統計収集をプラガブル・データベースとともに使用すると、データの可視性と権限の要件が一致しない場合があります。
オプティマイザ統計を収集する場合、データベースで内部プロシージャがコールされます。このプロシージャは、GATHER_DATABASE_STATS
プロシージャをGATHER AUTO
オプションを指定して実行する場合と同様に動作します。自動統計収集はデータベース内のすべてのプリファレンス・セットに従います。
手動収集と自動収集の主な違いは、自動収集では統計が必要となるデータベース・オブジェクトが優先される点です。自動収集では、メンテナンス・ウィンドウがクローズされる前にすべてのオブジェクトが評価され、統計がないか、非常に古い統計があるオブジェクトが優先されます。
注意:
手動で統計を収集する場合は、自動収集のオブジェクト優先付けをDBMS_AUTO_TASK_IMMEDIATE
パッケージを使用して再現できます。このパッケージでは、自動夜間統計収集ジョブで実行されるものと同じ統計収集ジョブが実行されます。
関連項目:
コンテナ・データベース(CDB)内での管理機能の動作をまとめた表が記載されている『Oracle Database管理者ガイド』を参照してください
Cloud Controlを使用して、自動オプティマイザ統計収集など、すべての自動メンテナンス・タスクを有効化および無効化できます。
ほとんどの場合、デフォルトのウィンドウ・タイミングで問題なく機能します。しかし、バルク・ロードなどの操作を、ウィンドウ内で行うことも考えられます。そのような場合、自動統計収集と同時に操作を行うことにより競合が発生するのを回避するには、必要に応じてウィンドウを変更することをお薦めします。
Cloud Controlを使用して自動オプティマイザ統計収集を管理する手順は次のとおりです。
「Cloud Controlのデータベース・ホーム・ページへのアクセス」の説明に従って、「データベース・ホーム」ページにアクセスします。
「管理」メニューから、「Oracle Scheduler」を選択し、「自動化メンテナンス・タスク」を選択します。
自動化メンテナンス・タスク・ページが表示されます。
このページには、事前定義されたタスクが表示されます。各タスクに関する情報を取得するには、タスクに対応するリンクをクリックします。
「構成」をクリックします。
「自動化メンテナンス・タスク構成」ページが表示されます。
デフォルトでは、自動オプティマイザ統計収集はMAINTENANCE_WINDOW_GROUP
内の事前に定義されたすべてのメンテナンス・ウィンドウで実行されます。
次の手順を実行します。
「オプティマイザ統計の収集」の「タスク設定」セクションで、「有効」または「無効」のいずれかを選択して自動化タスクを有効化または無効化します。
注意:
自動統計収集は、ディクショナリ・オブジェクトおよびユーザー・オブジェクトに対する問合せの最適な計画をオプティマイザが生成する上で重要であるため、無効にしないことを強くお薦めします。自動収集を無効にする場合は、ディクショナリ・スキーマおよびユーザー・スキーマに対して適切な自動統計収集の方針を立てるようにしてください。
週の特定の日に統計収集を無効化するには、ウィンドウ名の横にある該当するチェック・ボックスを選択します。
ウィンドウ・グループの特性を変更するには、「ウィンドウ・グループの編集」をクリックします。
ウィンドウの時間を変更するには、ウィンドウの名前(「MONDAY_WINDOW」など)をクリックし、「スケジュール」セクションで「編集」をクリックします。
ウィンドウの編集ページが表示されます。
このページでは、ウィンドウ実行の期間や開始時間などのパラメータを変更できます。
「適用」をクリックします。
関連項目:
Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照してください。
Cloud Controlを使用せずに自動オプティマイザ統計収集を構成する場合は、コマンドラインを使用する必要があります。
次の選択肢があります。
DBMS_AUTO_TASK_ADMIN
PL/SQLパッケージに含まれるENABLE
またはDISABLE
プロシージャを実行します。
コマンドラインで使用する手法としては、このパッケージをお薦めします。ENABLE
およびDISABLE
プロシージャのどちらに対しても、window_name
パラメータを使用して特定のメンテナンス・ウィンドウを指定できます。
STATISTICS_LEVEL
(初期化レベル)をBASIC
に設定して、自動化SQLチューニング・アドバイザなどすべてのアドバイザおよび統計の収集を無効化します。
注意:
監視機能と多くの自動機能が無効になるため、STATISTICS_LEVEL
はBASIC
に設定しないことを強くお薦めします。
DBMS_AUTO_TASK_ADMINを使用して自動統計収集を管理する手順は次のとおりです。
管理者権限でデータベースにSQL*Plusを接続し、次のいずれかを実行します。
自動タスクを有効にするには、次のPL/SQLブロックを実行します。
BEGIN DBMS_AUTO_TASK_ADMIN.ENABLE ( client_name => 'auto optimizer stats collection' , operation => NULL , window_name => NULL ); END; /
自動タスクを無効にするには、次のPL/SQLブロックを実行します。
BEGIN DBMS_AUTO_TASK_ADMIN.DISABLE ( client_name => 'auto optimizer stats collection' , operation => NULL , window_name => NULL ); END; /
データ・ディクショナリを問い合せて、変更を確認します。
たとえば、次のようにDBA_AUTOTASK_CLIENT
を問い合せます。
COL CLIENT_NAME FORMAT a31 SELECT CLIENT_NAME, STATUS FROM DBA_AUTOTASK_CLIENT WHERE CLIENT_NAME = 'auto optimizer stats collection';
出力例は次のように表示されます。
CLIENT_NAME STATUS ------------------------------- -------- auto optimizer stats collection ENABLED
自動統計収集のウィンドウ属性を変更する手順は次のとおりです。
管理者権限でSQL*Plusをデータベースに接続します。
必要に応じてメンテナンス・ウィンドウの属性を変更します。
たとえば、月曜日のメンテナンス・ウィンドウが午前5時に開始されるように変更するには、次のPL/SQLプログラムを実行します。
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE ( 'MONDAY_WINDOW' , 'repeat_interval' , 'freq=daily;byday=MON;byhour=05;byminute=0;bysecond=0' ); END; /
関連項目:
DBMS_AUTO_TASK_ADMIN
パッケージの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
STATISTICS_LEVEL
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください
このトピックでは、DBMS_STATS.SET_*_PREFS
プロシージャを使用してオプティマイザ統計のデフォルトを設定する方法について説明します。
この項の内容は次のとおりです。
オプティマイザ統計プリファレンスでは、自動統計収集およびDBMS_STATS
統計収集プロシージャで使用されるパラメータのデフォルト値が設定されます。
表、スキーマ、データベース(すべての表)およびグローバル・レベルでオプティマイザ統計プリファレンスを設定できます。グローバル・プリファレンスは、プリファレンスなしの表および将来作成される表を示します。SET_*_PREFS
形式の後にプロシージャ名が続きます。
DBMS_STATS.SET_*_PREFS
プロシージャは、DBMS_STATS.GATHER_*_STATS
プロシージャで使用されるパラメータのデフォルト値を変更します。現在のプリファレンスを問い合せるには、DBMS_STATS.GET_PREFS
ファンクションを使用します。
統計プリファレンスを設定すると、優先順位は次のようになります。
表プリファレンス(特定の表、スキーマ内のすべての表、またはデータベース内のすべての表に設定)
グローバル・プリファレンス
デフォルト・プリファレンス
次の表は、関連するDBMS_STATS
プロシージャをまとめたものです。
表12-1 オプティマイザ統計プリファレンスを設定するDBMS_STATSプロシージャ
プロシージャ | 有効範囲 |
---|---|
|
指定された表のみ。 |
|
指定されたスキーマのすべての既存の表。 このプロシージャは、指定されたスキーマの各表で |
|
データベースでユーザーが定義したすべてのスキーマ。 このプロシージャは、指定されたスキーマの各表で |
|
既存の表プリファレンスを持たないすべての表。 表プリファレンスが設定されているか、
グローバル・レベルで |
関連項目:
オプティマイザ統計の設定に関するDBMS_STATS
プロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
この例は、SET_TABLE_PREFS
、SET_SCHEMA_STATS
およびSET_DATABASE_PREFS
の関係を示しています。
表12-2 統計収集プロシージャのプリファレンスの変更
アクション | 説明 |
---|---|
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh','costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- TRUE |
|
SQL> EXEC DBMS_STATS.SET_TABLE_PREFS ('sh', 'costs', 'incremental', 'false'); PL/SQL procedure successfully completed. |
|
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh', 'costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- FALSE |
|
SQL> EXEC DBMS_STATS.SET_SCHEMA_PREFS ('sh', 'incremental', 'true'); PL/SQL procedure successfully completed. |
|
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh', 'costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- TRUE |
|
SQL> EXEC DBMS_STATS.SET_DATABASE_PREFS ('incremental', 'false'); PL/SQL procedure successfully completed. |
|
SQL> SELECT DBMS_STATS.GET_PREFS ('incremental', 'sh', 'costs') AS "STAT_PREFS" FROM DUAL; STAT_PREFS ---------- FALSE |
|
グローバル・プリファレンスは、既存の表プリファレンスを持たないデータベース内のすべてのオブジェクトに適用されます。Cloud Controlを使用してグローバル・レベルでオプティマイザ統計プリファレンスを設定できます。
Cloud Controlを使用してグローバル・オプティマイザ統計プリファレンスを設定する手順は次のとおりです。
「オプティマイザ統計コンソール」へのアクセスの説明に従って、オプティマイザ統計コンソール・ページに移動します。
「グローバル統計の採取オプション」をクリックします。
「グローバル統計の採取オプション」ページが表示されます。
必要な変更を行い、「適用」をクリックします。
関連項目:
Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照してください。
Cloud Controlを使用してデータベース、スキーマおよび表の各レベルでオプティマイザ統計プリファレンスを設定できます。
Cloud Controlを使用してオブジェクト・レベルのオプティマイザ統計プリファレンスを設定する手順は次のとおりです。
「オプティマイザ統計コンソール」へのアクセスの説明に従って、オプティマイザ統計コンソールに移動します。
「オブジェクト・レベルの統計採取プリファレンス」をクリックします。
「オブジェクト・レベルの統計採取プリファレンス」が表示されます。
表レベルのプリファレンス・セットがある表のプリファレンスを変更するには、次を行います(変更しない場合は次のステップにスキップします)。
「スキーマ」および「表名」に値を入力します。スキーマ内のすべての表を表示するには、「表名」を空白のままにします。
ページが表の名前で更新されます。
必要な表を選択して、「プリファレンスの編集」をクリックします。
「プリファレンスの編集」ページの「一般」サブページが表示されます。
必要に応じてプリファレンスを変更し、「適用」をクリックします。
表レベルのプリファレンス・セットがない表のプリファレンスを設定するには、次を実行します(設定しない場合は次のステップにスキップします)。
「表のプリファレンスの追加」をクリックします。
「表のプリファレンスの追加」ページの「一般」サブページが表示されます。
「表名」でスキーマと表名を入力します。
必要に応じてプリファレンスを変更し、「OK」をクリックします。
スキーマのプリファレンスを設定するには、次を実行します。
「スキーマ表のプリファレンスの設定」をクリックします。
「スキーマ・プリファレンスの編集」ページの「一般」サブページが表示されます。
「スキーマ」でスキーマ名を入力します。
必要に応じてプリファレンスを変更し、「OK」をクリックします。
関連項目:
Oracle Enterprise Manager Cloud Controlのオンライン・ヘルプを参照してください。
オプティマイザ統計プリファレンスの設定にCloud Controlを使用しない場合は、表12-1
で説明したDBMS_STATSプロシージャを呼び出すことができます。
前提条件
このタスクには次の前提条件があります。
グローバル・プリファレンスまたはデータベース・プリファレンスを設定するには、SYSDBA
権限、またはANALYZE ANY DICTIONARY
システム権限およびANALYZE ANY
システム権限の両方を所有している必要があります。
スキーマ・プリファレンスを設定するには、所有者として接続するか、またはSYSDBA
権限、あるいはANALYZE ANY
システム権限を所有している必要があります。
表プリファレンスを設定するには、表の所有者として接続するか、またはANALYZE ANY
システム権限を所有している必要があります。
コマンドラインからオプティマイザ統計プリファレンスを設定する手順は次のとおりです。
必要な権限でSQL*Plusをデータベースに接続します。
オプションで、DBMS_STATS.GET_PREFS
プロシージャをコールして、オブジェクト・レベルで設定されているプリファレンスを確認します。特定の表が設定されていない場合は、グローバル・レベルで設定されているプリファレンスを確認します。
たとえば、sh.sales
表のSTALE_PERCENT
パラメータ設定を次のように取得します。
SELECT DBMS_STATS.GET_PREFS('STALE_PERCENT', 'SH', 'SALES') FROM DUAL;
表12-1の適切なプロシージャを、次のパラメータを指定して実行します。
ownname
- スキーマ名の設定(SET_TAB_PREFS
およびSET_SCHEMA_PREFS
のみ)
tabname
- 表名の設定(SET_TAB_PREFS
のみ)
pname
- パラメータ名の設定
pvalue
- パラメータ値の設定
add_sys
- システム表の追加(オプションでSET_DATABASE_PREFS
のみ)
次の例では、表の統計が失効しているとみなされる前に、sh.sales
の行の13%が変更される必要があることを指定しています。
EXEC DBMS_STATS.SET_TABLE_PREFS('SH', 'SALES', 'STALE_PERCENT', '13');
オプションで、*_TAB_STAT_PREFS
ビューを問い合せて変更を確認します。
たとえば、次のようにDBA_TAB_STAT_PREFS
を問い合せます。
COL OWNER FORMAT a5 COL TABLE_NAME FORMAT a15 COL PREFERENCE_NAME FORMAT a20 COL PREFERENCE_VALUE FORMAT a30 SELECT * FROM DBA_TAB_STAT_PREFS;
出力例は次のように表示されます。
OWNER TABLE_NAME PREFERENCE_NAME PREFERENCE_VALUE ----- --------------- -------------------- ------------------------------ OE CUSTOMERS NO_INVALIDATE DBMS_STATS.AUTO_INVALIDATE SH SALES STALE_PERCENT 13
関連項目:
プログラム・ユニットのパラメータ名およびパラメータ値の説明は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
自動統計収集の代替または補足として、DBMS_STATS
パッケージを使用し、統計を手動で収集できます。
この項の内容は次のとおりです。
関連項目:
DBMS_STATS
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
DBMS_STATS
パッケージを使用してオプティマイザ統計を操作します。オブジェクト、スキーマおよびデータベースなどの様々なレベルに細分化してオブジェクトおよび列の統計を収集できます。また、物理システムの統計を収集できます。
次の表では、オプティマイザ統計収集のDBMS_STATS
プロシージャの概要が示されています。このパッケージでは、表クラスタの統計は収集されません。ただし、表クラスタの個々の表の統計は収集できます。
表12-3 オプティマイザ統計収集のDBMS_STATSプロシージャ
プロシージャ | 説明 |
---|---|
|
索引統計を収集します。 |
|
表、列および索引の各統計を収集します。 |
|
スキーマのすべてのオブジェクトの統計を収集します。 |
|
|
|
データベース内ですべてのオブジェクトの統計を収集します。 |
OPTIONS
パラメータがGATHER STALE
またはGATHER AUTO
に設定されている場合は、失効した統計を含むすべての表および統計がないすべての表の統計がGATHER_SCHEMA_STATS
プロシージャおよびGATHER_DATABASE_STATS
プロシージャで収集されます。監視対象の表の変更が10%を超えた場合は、これらの統計が失効していると判断され、再び統計が収集されます。
注意:
「自動オプティマイザ統計収集の構成」の説明に従って、夜間に統計を自動収集するジョブを構成できます。
関連項目:
DBMS_STATS
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
適度な速度で変更されるデータベース・オブジェクトに対しては、ほとんどの場合、自動収集で十分です。
次のような場合、自動収集が不適当または使用できないことがあります。
特定のタイプのバルク・ロードを実行する際に、問合せを即座に実行する必要があるために、統計収集のメンテナンス・ウィンドウを待機できない場合。「バルク・ロードのためのオンライン統計収集」を参照してください。
代表的ではないワークロードを実行しているときに、固定表の統計を自動統計収集で収集する場合。「固定オブジェクトの統計情報の収集」を参照してください。
自動統計収集はシステム統計を収集しません。「システム統計の手動収集」を参照してください。
日中に削除または切り捨てられて再作成される変化しやすい表。「動的統計を使用した変化しやすい表の統計の収集」を参照してください。
この項では、手動での統計収集を選択することになる一般的な状況に対してガイドラインを提供します。
オプティマイザ統計において、サンプリングとは表の行のランダムなサブセットから統計を収集することです。サンプリングでは、データベースによる全表スキャンと表全体のソートを避けることができるため、統計収集に必要なリソースが最小化されます。
データベースでは、表内のすべての表が処理される場合、つまり100%のサンプルが取得される場合に最も正確な統計が収集されます。ただし、サンプル・サイズが大きくなるほど、統計収集操作にかかる時間も長くなります。課題は、妥当な時間で正確な統計を取得できるようなサンプル・サイズを決定することです。
DBMS_STATS
では、サンプリングする表内の行の割合を制御するESTIMATE_PERCENT
パラメータをユーザーが指定した場合にサンプリングが使用されます。パフォーマンスの向上を最大化するとともに必要な統計の正確性を達成するには、ESTIMATE_PERCENT
パラメータでデフォルト設定のDBMS_STATS.AUTO_SAMPLE_SIZE
を使用することをお薦めします。この場合、Oracle Databaseは、サンプル・サイズを自動的に選択します。この設定により、次の使用が有効になります。
サンプリングよりはるかに高速なハッシュ・ベースのアルゴリズム
このアルゴリズムではすべての行が読み取られ、100%のサンプルから生成された統計と同じぐらい正確な統計が生成されます。この手法を使用して計算された統計は確定的です。
増分統計
同時統計
新規ヒストグラム・タイプ(「ハイブリッド・ヒストグラム」を参照)
DBA_TABLES.SAMPLE_SIZE
列は、統計を収集するために使用される実際のサンプル・サイズを示します。
デフォルトでは、表または索引レベルに指定された並列度で統計が収集されます。この設定は、DBMS_STATS
収集プロシージャのdegree
引数で上書きできます。
degree
をDBMS_STATS.AUTO_DEGREE
に設定することをお薦めします。この設定を使用すると、オブジェクト・サイズおよびパラレル化関連の初期化パラメータに基づいて適切な並列度が選択されます。
データベースでは、ほとんどの統計をシリアルまたはパラレルで収集できます。ただし、クラスタ索引、ドメイン索引およびビットマップ結合索引などの一部の索引統計は、データベースによってパラレルで収集されることはありません。データベースでは、パラレルでの統計収集時にサンプリングを使用できます。
注意:
統計のパラレル収集と同時収集を混同しないでください。「同時統計収集について」を参照してください。
パーティション表および索引に対して、DBMS_STATS
は、各パーティションの個別の統計を収集できます。また、全表または全索引のグローバル統計も収集できます。コンポジット・パーティションについても同様に、DBMS_STATS
はサブパーティション、パーティション、全表および全索引の個別の統計を収集できます。
DBMS_STATS
プロシージャに対してgranularity
引数を使用して、収集されるパーティション統計のタイプを決定します。granularity
をデフォルト値のAUTO
に設定し、パーティションのタイプに応じてサブパーティション統計、パーティション統計またはグローバル統計を収集することをお薦めします。ALL
設定では、すべてのタイプの統計が収集されます。
表の変更が頻繁に行われる場合は、表が失効しないように十分な回数の統計を収集しますが、収集のオーバーヘッドでパフォーマンスが低下しない回数にします。新しい統計の収集が週に一度または月に一度しか必要がない場合もあります。ベスト・プラクティスは、スクリプトまたはジョブ・スケジューラを使用して、DBMS_STATS.GATHER_SCHEMA_STATS
プロシージャおよびDBMS_STATS.GATHER_DATABASE_STATS
プロシージャを定期的に実行することです。
表に失効した統計があるということは、表のデータを正確に反映していないということになります。データベースでは、データベース・オブジェクトに新しい統計が必要となるタイミングの判別に役立つ表監視機能が提供されます。
監視では、最新の統計収集以降の、表でのDML操作の概数と、表が切り捨てられたかどうかが追跡されます。DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
を実行することで、メモリーに保持されている未処理の監視情報をただちに反映できます。このプロシージャの実行後に、DBA_TAB_STATISTICS
およびDBA_IND_STATISTICS
のSTALE_STATS
列を問い合せて、統計が失効しているかどうかを確認します。この列は、DBA_TAB_MODIFICATIONS
ビューおよびDBMS_STATS
のSTALE_PERCENT
プリファレンスのデータに基づきます。
STALE_STATS
列の値は、次のとおりです。
YES
統計が失効しています。
NO
統計は失効していません。
NULL
統計が収集されていません。
GATHER AUTO
オプションを指定してGATHER_SCHEMA_STATS
またはGATHER_DATABASE_STATS
を実行すると、統計がないか失効しているオブジェクトのみの統計が収集されます。
前提条件
このチュートリアルでは、次のことが前提となっています。
表監視がsh.sales
に対して有効化されています。STATISTICS_LEVEL
初期化パラメータがTYPICAL
またはALL
に設定されている場合はデフォルトで有効化されています。
ANALYZE_ANY
システム権限があり、DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
プロシージャを実行できます。
失効した統計を判別する手順は次のとおりです。
必要な権限でSQL*Plusをデータベースに接続します。
オプションで、データベース監視情報をメモリーからディスクに書き込みます。
たとえば、次のプロシージャを実行します。
BEGIN DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO; END; /
データ・ディクショナリを問い合せて失効している統計を確認します。
次の例では、sh.sales
表で失効している統計を問い合せます(出力の一部を含む)。
COL PARTITION_NAME FORMAT a15 SELECT PARTITION_NAME, STALE_STATS FROM DBA_TAB_STATISTICS WHERE TABLE_NAME = 'SALES' AND OWNER = 'SH' ORDER BY PARTITION_NAME; PARTITION_NAME STA --------------- --- SALES_1995 NO SALES_1996 NO SALES_H1_1997 NO SALES_H2_1997 NO SALES_Q1_1998 NO SALES_Q1_1999 NO . . .
関連項目:
DBA_TAB_MODIFICATIONS
ビューの詳細は、『Oracle Databaseリファレンス』を参照してください
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO
プロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
表統計を収集するにはGATHER_TABLE_STATS
を使用し、スキーマ内のすべてのオブジェクトの統計を収集するにはGATHER_SCHEMA_STATS
を使用します。
DBMS_STATSを使用してスキーマ統計を収集する手順は次のとおりです。
SQL*Plusを起動し、実行するプロシージャに対する適切な権限でデータベースに接続します。
GATHER_TABLE_STATS
プロシージャまたはGATHER_SCHEMA_STATS
プロシージャを実行して、必要なパラメータを指定します。
一般的には次のパラメータがあります。
所有者 - ownname
オブジェクト名 - tabname
、indname
、partname
並列度 - degree
関連項目:
GATHER_TABLE_STATSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
例12-1 表統計の収集
この例では、DBMS_STATS
パッケージを使用して、並列設定が2
のsh.customers
表の統計を収集します。
BEGIN DBMS_STATS.GATHER_TABLE_STATS ( ownname => 'sh' , tabname => 'customers' , degree => 2 ); END; /
固定オブジェクトとは、動的パフォーマンス表とその索引です。これらのオブジェクトは、現在のデータベース・アクティビティを記録します。
他のデータベース表とは異なり、オプティマイザ統計が見つからない場合にX$
表を参照するSQL文の動的統計が自動的に使用されることはありません。かわりに、オプティマイザは事前定義されたデフォルト値を使用します。このデフォルト値は代表的なものではない場合があり、最適ではない実行計画につながる可能性があります。したがって、固定オブジェクトの統計を最新のものにしておくことが重要です。
Oracle Databaseは、以前に収集されていない場合、自動統計収集の一部として自動的に固定オブジェクトの統計を収集します(「自動オプティマイザ統計収集の制御」を参照)。DBMS_STATS.GATHER_FIXED_OBJECTS_STATS
をコールして手動で固定オブジェクトの統計を収集することもできます。統計は、代表的なアクティビティがデータベースで行われているときに収集することをお薦めします。
前提条件
このプロシージャを実行するには、SYSDBA
またはANALYZE ANY DICTIONARY
システム権限が必要です。
GATHER_FIXED_OBJECTS_STATSを使用してスキーマ統計を収集する手順は次のとおりです。
SQL*Plusを起動し、実行するプロシージャに対する適切な権限でデータベースに接続します。
必要なパラメータを指定して、DBMS_STATS.GATHER_FIXED_OBJECTS_STATS
プロシージャを実行します。
一般的には次のパラメータがあります。
現在の統計情報の保存場所を示す表の識別子: stattab
stattab
内の統計情報を関連付ける識別子(オプション): statid
stattab
を含んだスキーマ(現在のスキーマと異なる場合): statown
関連項目:
GATHER_TABLE_STATSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
例12-2 表統計の収集
この例では、DBMS_STATS
パッケージを使用して固定オブジェクトの統計を収集します。
BEGIN DBMS_STATS.GATHER_FIXED_OBJECTS_STATS; END; /
変化しやすい表(日中の間に著しく変更される表)の統計はすぐに失効します。たとえば、表は削除または切捨てが行われたり、再構築されたりする可能性があります。
変化しやすいオブジェクトの統計をNULLに設定した場合は、Oracle Databaseでは動的統計を使用して最適化中に必要な統計が動的に収集されます。OPTIMIZER_DYNAMIC_SAMPLING
初期化パラメータでこの機能を制御します。
注意:
オプティマイザ統計のロックおよびロック解除の説明のように、代表的な統計を収集してロックすることは、変化しやすい表の統計を失効しないようにする代替の手法です。
前提条件
このチュートリアルでは、次のことが前提となっています。
oe.orders
表は非常に変化しやすい表です。
orders
表の統計を削除した上でロックし、データベースでその表の統計が収集されないようにします。この方法では、データベースによって、必要な統計を問合せ最適化の一部として動的に収集できます。
oe
ユーザーは、DBMS_XPLAN.DISPLAY_CURSOR
の問合せに必要な権限を持っています。
オプティマイザ統計を削除およびロックする手順は次のとおりです。
oe
ユーザーとしてデータベースに接続した上でoe
表の統計を削除します。
たとえば、次のプロシージャを実行します。
BEGIN DBMS_STATS.DELETE_TABLE_STATS('OE','ORDERS'); END; /
oe
表の統計をロックします。
たとえば、次のプロシージャを実行します。
BEGIN DBMS_STATS.LOCK_TABLE_STATS('OE','ORDERS'); END; /
orders
表を問い合せます。
たとえば、次の文を使用します。
SELECT COUNT(order_id) FROM orders;
カーソル内の計画を問い合せます。
次のコマンドを実行します(出力の一部を含む)。
SET LINESIZE 150
SET PAGESIZE 0
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR);
SQL_ID aut9632fr3358, child number 0
-------------------------------------
SELECT COUNT(order_id) FROM orders
Plan hash value: 425895392
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 2 (100)| |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| ORDERS | 105 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------
Note
-----
- dynamic statistics used for this statement (level=2)
前述の実行計画の注意には、データベースでSELECT
文の動的統計を使用したことが示されています。
関連項目:
Oracle Databaseでは複数の表またはパーティションの統計を同時に収集できます。
Oracle Databaseでは複数の表またはパーティションの統計を同時に収集できます。この項の内容は次のとおりです。
デフォルトでは、パーティション表の各パーティションは順に収集されます。
同時統計収集モードを有効にすると、スキーマ内の複数の表、表内の複数のパーティションまたはサブパーティションに対して、オプティマイザ統計をデータベースで同時に収集できます。データベースで複数のプロセッサをすべて使用可能にすることで、同時性により、統計の収集に必要な全体の時間を減らすことができます。
注意:
同時統計収集モードはパラレル問合せ処理に依存しませんが、その使用は可能です。
Oracle Databaseでは、複数のツールおよびテクノロジを使用して、複数の統計収集ジョブを同時に作成および管理します。
データベースでは次のものが使用されます。
Oracle Scheduler
Oracle Database Advanced Queuing(AQ)
Oracle Database Resource Manager(Resource Manager)
DBMS_STATS.SET_GLOBAL_PREF
を使用してCONCURRENT
プリファレンスを設定することで同時統計収集を有効化します。
データベースでは可能なかぎり多くの同時ジョブが実行されます。Job Schedulerは、同時に実行するジョブの数およびキューに入れるジョブの数を決定します。ジョブの実行が完了すると、データベースですべての表、パーティションおよびサブパーティションの統計の収集が完了するまで、スケジューラによってさらにジョブがデキューされ実行されます。ジョブの最大数は、JOB_QUEUE_PROCESSES
初期化パラメータと使用可能なシステム・リソースによる制約を受けます。
ほとんどの場合、DBMS_STATS
プロシージャによって表のパーティションまたはサブパーティションごとに別のジョブが作成されます。ただし、パーティションまたはサブパーティションが空または非常に小さい場合には、ジョブ・メンテナンスのオーバーヘッドを減らすために、データベースで自動的にそのオブジェクトと他の小さなオブジェクトを1つのジョブに一括する場合があります。
次の図には異なるレベルでのジョブの作成が示されています。表3はパーティション化された表で、その他の表はパーティション化されていません。ジョブ3は、表3のコーディネータ・ジョブとして動作し、その表のパーティションごとにジョブを作成するほか、表3のグローバル統計用に別のジョブを作成します。次の例では、増分統計収集が有効化されていることを前提としています。無効化されている場合、パーティションのジョブの完了後にグローバル統計パーティション・レベルの統計からグローバル統計が導出されます。
関連項目:
DBMS_STATS
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
JOB_QUEUE_PROCESSES
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。
DBMS_STATS
パッケージでは、ユーザーが開始した統計収集コールの一部である同時統計収集ジョブによって使用されるリソースを明示的に管理することはありません。したがって、データベースでは、同時統計収集の間にシステム・リソースをすべて使用する場合があります。この状況に対処するには、Resource Managerを使用して同時統計収集ジョブで消費するリソースに上限を設けます。Resource Managerで同時統計収集を有効にしておく必要があります。
システムによって提供されるコンシューマ・グループであるORA$AUTOTASK
には、すべての統計収集ジョブが登録されています。ORA$AUTOTASK
に対して適切なリソースが割り当てられているリソース計画を作成して、同時統計収集で使用可能なリソースがすべて消費されることを回避できます。独自のリソース計画が存在せず、かつそれを作成しない場合は、システムによって提供されるDEFAULT_PLAN
を含むResource Managerのアクティブ化を検討してください。
注意:
ORA$AUTOTASK
コンシューマ・グループは、メンテナンス・ウィンドウ中に自動実行されるメンテナンス・タスクと共有されます。したがって、自動統計収集で同時実行性がアクティブ化されている場合は、追加の手順を要することなく、データベースでリソースが自動管理されます。
関連項目:
Resource Managerの詳細は、『Oracle Database管理者ガイド』を参照してください。
同時統計収集を有効化するには、DBMS_STATS.SET_GLOBAL_PREFS
プロシージャを使用してCONCURRENT
プリファレンスを設定します。
次の値があります。
MANUAL
手動統計収集でのみ、同時実行性が有効化されます。
AUTOMATIC
自動統計収集でのみ、同時実行性が有効化されます。
ALL
手動と自動の両方の統計収集で、同時実行性が有効化されます。
OFF
手動と自動の両方の統計収集で、同時実行性が無効化されます。これはデフォルト値です。
この項のこのチュートリアルでは、同時統計収集を有効化する方法について説明します。
前提条件
このチュートリアルの前提条件は、次のとおりです。
統計収集の標準的な権限に加えて、次の権限を所有している必要があります。
CREATE JOB
MANAGE SCHEDULER
MANAGE ANY QUEUE
SYSAUX
表領域をオンラインにする必要があるのは、スケジューラでその内部表とビューをこの表領域に格納するためです。
JOB_QUEUE_PROCESSES
初期化パラメータを少なくとも4
に設定する必要があります。
Resource Managerを有効化する必要があります。
デフォルトでは、Resource Managerは無効になっています。リソース計画がない場合は、システムによって提供されるDEFAULT_PLAN
を含むResource Managerの有効化を検討してください。
前提条件
このチュートリアルでは、次の操作を行うものとします。
同時統計収集の有効化
sh
スキーマの統計の収集
sh
統計の収集の監視
同時統計収集を有効化する手順は次のとおりです。
適切な権限でSQL*Plusをデータベースに接続し、Resource Managerを有効化します。
次の例では、Resource Managerのデフォルトの計画が使用されています。
ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'DEFAULT_PLAN';
JOB_QUEUE_PROCESSES
初期化パラメータをCPUのコア数の少なくとも2倍に設定します。
Oracle Real Application Clustersでは、JOB_QUEUE_PROCESSES
設定が各ノードに適用されます。
システムに4個のCPUコアがあると想定します。次の例では、パラメータを8
(コア数の2倍)に設定します。
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=8;
パラメータの変更が有効になったことを確認します。
たとえば、SQL*Plusに次のコマンドを入力します(出力例も示します)。
SHOW PARAMETER PROCESSES; NAME TYPE VALUE -------------------------------- ----------- ----- _high_priority_processes string VKTM aq_tm_processes integer 1 db_writer_processes integer 1 gcs_server_processes integer 0 global_txn_processes integer 1 job_queue_processes integer 8 log_archive_max_processes integer 4 processes integer 100
同時統計を有効化します。
たとえば、次のPL/SQL無名ブロックを実行します。
BEGIN DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT','ALL'); END; /
統計が有効化されたことを確認します。
たとえば、次の問合せを実行します(出力例も示します)。
SELECT DBMS_STATS.GET_PREFS('CONCURRENT') FROM DUAL; DBMS_STATS.GET_PREFS('CONCURRENT') ---------------------------------- ALL
SH
スキーマの統計を収集します。
たとえば、次のプロシージャを実行します。
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SH');
別のセッションでは、DBA_OPTSTAT_OPERATION_TASKS
を問い合せることでジョブの進行状況を監視します。
たとえば、次の問合せを実行します(出力例も示します)。
SET LINESIZE 1000 COLUMN TARGET FORMAT a8 COLUMN TARGET_TYPE FORMAT a25 COLUMN JOB_NAME FORMAT a14 COLUMN START_TIME FORMAT a40 SELECT TARGET, TARGET_TYPE, JOB_NAME, TO_CHAR(START_TIME, 'dd-mon-yyyy hh24:mi:ss') FROM DBA_OPTSTAT_OPERATION_TASKS WHERE STATUS = 'IN PROGRESS' AND OPID = (SELECT MAX(ID) FROM DBA_OPTSTAT_OPERATIONS WHERE OPERATION = 'gather_schema_stats'); TARGET TARGET_TYPE JOB_NAME TO_CHAR(START_TIME,' --------- ------------------------- -------------- -------------------- SH.SALES TABLE (GLOBAL STATS ONLY) ST$T292_1_B29 30-nov-2012 14:22:47 SH.SALES TABLE (COORDINATOR JOB) ST$SD290_1_B10 30-nov-2012 14:22:08
元のセッションでは、同時統計収集を無効化します。
たとえば、次の問合せを実行します。
EXEC DBMS_STATS.SET_GLOBAL_PREFS('CONCURRENT','OFF');
関連項目:
Oracle Database管理者ガイド
DBMS_STATS.SET_GLOBAL_PREFS
プロシージャの使用方法の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
同時
統計収集を有効化すると、各統計収集ジョブをパラレルで実行できます。この組合せは、大きな表、パーティションまたはサブパーティションの分析に役立ちます。このトピックでは、推奨される構成について説明します。
パラレル実行および同時統計収集のためのシステムを構成する手順は次のとおりです。
管理者権限でSQL*Plusをデータベースに接続します。
パラレル適応マルチユーザー初期化パラメータを無効化します。
たとえば、次のSQL文を使用します。
ALTER SYSTEM SET PARALLEL_ADAPTIVE_MULTI_USER=false;
パラレル・キューイングが有効になっているリソース・プランを使用するようにデータベースを構成します。
次の手順を実行します。
Oracle Database Resource Manager(Resource Manager)がアクティブ化されていない場合は、アクティブ化します。デフォルトでは、Resource Managerはメンテナンス・ウィンドウ中にのみアクティブ化されます。
コンシューマ・グループOTHER_GROUPS
のキューイングが有効になっている一時リソース・プランを作成します。
次のサンプル・スクリプトでは、一時リソース・プラン(pqq_test
)の作成方法の1つが示されており、このプランを使用してResource Managerを有効化します。
BEGIN DBMS_RESOURCE_MANAGER.CREATE_PENDING_AREA(); DBMS_RESOURCE_MANAGER.CREATE_PLAN('pqq_test', 'pqq_test'); DBMS_RESOURCE_MANAGER.CREATE_PLAN_DIRECTIVE( 'pqq_test' , 'OTHER_GROUPS' , 'OTHER_GROUPS directive for pqq' , parallel_server_limit => 90 , max_utilization_limit => 90 ); DBMS_RESOURCE_MANAGER.SUBMIT_PENDING_AREA(); END; / ALTER SYSTEM SET RESOURCE_MANAGER_PLAN = 'pqq_test' SID='*';
関連項目:
Resource Managerを使用したリソースの管理方法の詳細は、『Oracle Database管理者ガイド』を参照してください
PARALLEL_ADAPTIVE_MULTI_USER
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください
データ・ディクショナリ・ビューを使用して、統計収集ジョブを監視できます。
次のビューが関連します。
DBA_OPTSTAT_OPERATION_TASKS
このビューには、統計収集操作の一部として実行されるまたは現在実行されているタスクの履歴が含まれています(DBA_OPTSTAT_OPERATIONS
に記録されます)。各タスクは、親操作に対応して処理されるターゲット・オブジェクトを示します。
DBA_OPTSTAT_OPERATIONS
このビューには、DBMS_STATS
パッケージを使用して表、スキーマおよびデータベース・レベルで実行されるまたは現在実行されている統計操作の履歴が含まれています。
前述のビューのTARGET
列には、統計収集ジョブのターゲット・オブジェクトが次の形式で表示されます。
OWNER.TABLE_NAME.PARTITION_OR_SUBPARTITION_NAME
統計収集ジョブの名前はすべて文字列のST$
で開始されます。
現在実行されている統計タスクおよびジョブを表示する手順は次のとおりです。
現在実行されている統計収集タスクをすべてのユーザー・セッションからリストするには、次のSQL文を使用します(出力例も示します)。
SELECT OPID, TARGET, JOB_NAnME, (SYSTIMESTAMP - START_TIME) AS elapsed_time FROM DBA_OPTSTAT_OPERATION_TASKS WHERE STATUS = 'IN PROGRESS'; OPID TARGET JOB_NAME ELAPSED_TIME ---- ------------------------- ------------- -------------------------- 981 SH.SALES.SALES_Q4_1998 ST$T82_1_B29 +000000000 00:00:00.596321 981 SH.SALES ST$SD80_1_B10 +000000000 00:00:27.972033
完了した統計タスクおよびジョブを表示する手順は次のとおりです。
特定の操作の完了したタスクおよびジョブのみをリストするには、まず統計収集操作の名前、ターゲットおよび開始時刻に基づいてDBA_OPTSTAT_OPERATIONS
ビューで操作IDを特定します。操作IDを特定したら、DBA_OPTSTAT_OPERATION_TASKS
ビューを問い合せて、その操作で対応するタスクを検索します。
たとえば、ID 981の操作をリストするには、SQL*Plusで次のコマンドを使用します(出力例も示します)。
VARIABLE id NUMBER EXEC :id := 981 SELECT TARGET, JOB_NAME, (END_TIME - START_TIME) AS ELAPSED_TIME FROM DBA_OPTSTAT_OPERATION_TASKS WHERE STATUS <> 'IN PROGRESS' AND OPID = :id; TARGET JOB_NAME ELAPSED_TIME ------------------------- ------------- -------------------------- SH.SALES_TRANSACTIONS_EXT +000000000 00:00:45.479233 SH.CAL_MONTH_SALES_MV ST$SD88_1_B10 +000000000 00:00:45.382764 SH.CHANNELS ST$SD88_1_B10 +000000000 00:00:45.307397
失敗した統計収集タスクおよびジョブを表示する手順は次のとおりです。
次のSQL文を使用します(出力例の一部も示します)。
SET LONG 10000 SELECT TARGET, JOB_NAME, (END_TIME - START_TIME) AS ELAPSED_TIME, NOTES FROM DBA_OPTSTAT_OPERATION_TASKS WHERE STATUS = 'FAILED'; TARGET JOB_NAME ELAPSED_TIME NOTES ------------------ -------- -------------------------- ---------------------- SYS.OPATCH_XML_INV +000000007 02:36:31.130314 <error>ORA-20011: Approximate NDV failed: ORA-29913: error in . . .
関連項目:
DBA_SCHEDULER_JOBS
ビューの詳細は、『Oracle Databaseリファレンス』を参照してください
増分統計では、変更されたパーティションのみがスキャンされます。パーティション・レベルの統計からグローバル統計を導出して大規模パーティション表の統計を収集する場合、増分統計メンテナンスによってパフォーマンスが向上します。
この項の内容は次のとおりです。
一般的な例では、アプリケーションによってレンジ・パーティション表の新規パーティションにデータがロードされます。アプリケーションで新しいパーティションの追加とデータのロードが行われると、データベースでは、新しいパーティションの統計を収集し、グローバル統計を最新の状態に維持することが必要になります。
通常、データ・ウェアハウス・アプリケーションは、大規模パーティション表にアクセスします。多くの場合、これらの表は日付列でパーティション化され、頻繁なDML変更の影響を受けるのは最近のパーティションのみです。増分統計を使用しない場合、通常は、統計収集で次の2段階アプローチが使用されます。
データベースで表をスキャンしてグローバル統計を収集する。
グローバル統計収集のための全表スキャンでは、表のサイズによっては非常に負荷がかかる可能性があります。表にパーティションが追加されるに従い、GATHER_TABLE_STATS
の実行時間が長くなります。これは、グローバル統計には全表スキャンが必要になるためです。パーティションの小規模なサブセットのみを変更する場合でも、データベースで表全体のスキャンを実行する必要があります。
データベースで変更されたパーティションをスキャンしてパーティション・レベルの統計を収集する。
増分メンテナンスでは、次のためにデータ・ウェアハウス・アプリケーションに大きなパフォーマンス上の利点があります。
データベースでは、表を1回のみスキャンしてパーティション統計を収集し、パーティション・レベルの統計を集計することによりグローバル統計を導出する必要があります。これにより、データベースは、増分統計を使用しない場合に必要な2つの全スキャン(パーティション・レベルの統計のスキャンとグローバル・レベルの統計のスキャン)を回避します。
後続の統計収集で、データベースは、失効したパーティションのスキャンと統計(シノプシスを含む)の更新のみが必要です。データベースは、新しいパーティション統計からグローバル統計を導出できるため、全表スキャンが不要です。
増分統計を使用する場合、データベースは、グローバルまたは表レベルの統計を変更するパーティションで引き続き統計を収集する必要があります。増分統計メンテナンスは、最初からの表統計の収集と同じ統計が得られますが、パフォーマンスが向上します。
増分統計メンテナンスが有効な場合、DBMS_STATS
では、変更されたパーティションのみの統計を収集し、シノプシスを作成します。また、データベースは、パーティション・レベルのシノプシスをグローバル・シノプシスに自動的にマージし、パーティション・レベルの統計およびグローバル・シノプシスからグローバル統計を導出します。
データベースでパーティション・レベルの統計からグローバル統計を導出して計算する際に全表スキャンが回避されます。たとえば、グローバル・レベルの行数はパーティションの行数の合計です。グローバル・ヒストグラムもパーティションのヒストグラムから導出できます。
ただし、列の NDVなど、パーティション・レベルの統計からすべての統計を導出することはできません。次の例は、表の2つのパーティションのNDVを示しています。
表12-2 4つのパーティションのNDV
オブジェクト | 列値 | NDV |
---|---|---|
Partition 1 | 1,3,3,4,5 | 4 |
Partition 2 | 2,3,4,5,6 | 5 |
個々のパーティションのNDVを加算して表のNDVを計算するとNDVは9となりますが、これは正しくありません。したがって、より正確な手法のシノプシスが必要です。
増分統計は、データベースが表および索引統計を収集および格納する方法に影響します。
最も重要な結果は次のとおりです。
SYSAUX
表領域では、パーティション表のグローバル統計を維持するために追加の領域が使用されます。
表がコンポジット・パーティションを使用する場合は、データベースは変更されたサブパーティションの統計のみを収集します。データベースは、未変更のサブパーティションに対しては、サブパーティション・レベルの統計を収集しません。このようにして、データベースは未変更のパーティションをスキップして作業を減らします。
表が増分統計を使用しており、この表にローカルでパーティション化された索引がある場合は、データベースは、変更された索引パーティションに対してグローバル・レベルで索引統計を収集します。データベースは、パーティション・レベルの統計からグローバル索引統計を生成することはしません。そのかわりに、データベースは全索引スキャンを実行してグローバル索引統計を収集します。
関連項目:
DBMS_STATS
パッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください
パーティション・メンテナンス操作は、表パーティションの追加、交換、マージ、分割など、パーティション関連の操作です。
Oracle Databaseにより、増分統計メンテナンスの次のサポートが提供されます。
パーティション・メンテナンス操作により統計の収集がトリガーされた場合、データベースでは、以前は古いセグメントで削除されていたシノプシスを再利用できるようになりました。
DBMS_STATS
によって非パーティション表にシノプシスを作成できるようになりました。シノプシスによって、データベースでは増分統計をパーティション交換操作の一部として維持できます。パーティション交換後にパーティションの統計を明示的に収集する必要はありません。
表でDBMS_STATS
プリファレンスのINCREMENTAL
をtrue
に設定した場合は、INCREMENTAL_LEVEL
プリファレンスによって、どのシノプシスをいつ収集するのかが制御されます。このプリファレンスの値は、次のいずれかです。
TABLE
DBMS_STATS
によって当該の表にある表レベルのシノプシスが収集されます。INCREMENTAL_LEVEL
に設定できるのは、表レベルのTABLE
のみです。スキーマ、データベースまたはグローバル・レベルには設定できません。
PARTITION
(デフォルト)
DBMS_STATS
によってパーティション表のパーティション・レベルのシノプシスのみが収集されます。
パーティション交換の実行時に、交換対象のパーティションを交換した後でシノプシスを使用する場合は、パーティションと交換する表でINCREMENTAL
をtrue
に、INCREMENTAL_LEVEL
をTABLE
に設定することをお薦めします。
前提条件
このチュートリアルでは、次のことが前提となっています。
空のパーティションp_sales_01_2010
をsales
表にロードします。
ステージング表t_sales_01_2010
を作成し、その表に値を移入します。
データベースで、増分統計をパーティション交換操作の一部として維持します。パーティション交換後にパーティションの統計を明示的に収集する必要はありません。
増分統計をパーティション交換操作の一部として維持する手順は次のとおりです。
ステージング表t_sales_01_2010
に対する増分統計のプリファレンスを設定します。
たとえば、次の文を実行します。
BEGIN DBMS_STATS.SET_TABLE_PREFS ( ownname => 'sh' , tabname => 't_sales_01_2010' , pname => 'INCREMENTAL' , pvalue => 'true' ); DBMS_STATS.SET_TABLE_PREFS ( ownname => 'sh' , tabname => 't_sales_01_2010' , pname => 'INCREMENTAL_LEVEL' , pvalue => 'table' ); END;
ステージング表t_sales_01_2010
の統計を収集します。
たとえば、次のPL/SQLコードを実行します。
BEGIN DBMS_STATS.GATHER_TABLE_STATS ( ownname => 'SH' , tabname => 'T_SALES_01_2010' ); END; /
DBMS_STATS
によってt_sales_01_2010
の表レベルのシノプシスが収集されます。
sh.sales
表でINCREMENTAL
プリファレンスがtrue
になるようにします。
たとえば、次のPL/SQLコードを実行します。
BEGIN DBMS_STATS.SET_TABLE_PREFS ( ownname => 'sh' , tabname => 'sales' , pname => 'INCREMENTAL' , pvalue => 'true' ); END; /
INCREMENTAL
をtrue
に設定する前にsh.sales
の統計を収集していない場合は、交換するパーティションの統計を収集します。
たとえば、次のPL/SQLコードを実行します。
BEGIN DBMS_STATS.GATHER_TABLE_STATS ( ownname => 'sh' , tabname => 'sales' , pname => 'p_sales_01_2010' , pvalue => granularity=>'partition' ); END; /
パーティション交換を実行します。
たとえば、次のSQL文を使用します。
ALTER TABLE sales EXCHANGE PARTITION p_sales_01_2010 WITH TABLE t_sales_01_2010;
交換後は、パーティション化された表に、パーティションp_sales_01_2010
の統計とシノプシスの両方が存在するようになります。
Oracle Database 12cより前のリリースでは、前述の文によってp_sales_01_2010
とt_sales_01_2010
のセグメント・データおよび統計を入れ替えていました。データベースでは、t_sales_01_2010
などのパーティション化されていない表のシノプシスを維持していませんでした。パーティション化された表のグローバル統計を収集するには、p_sales_01_2010
のパーティションを再スキャンしてそのシノプシスを取得する必要がありました。
関連項目:
DBMS_STATS.SET_TABLE_PREFS
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
Oracle Database 12cから、たとえパーティションまたはサブパーティションの統計が失効したりロックされても、パーティション化された表のグローバル統計を増分統計によって自動計算できるようになりました。
Oracle Database 12cより前のリリースで増分統計が有効化されている場合は、パーティションでDMLが実行されると、オプティマイザは、そのパーティションの統計が失効したと判断します。したがって、グローバル統計を正確に集計するには、DBMS_STATS
で再び統計を収集する必要があります。さらに、統計がロックされたパーティションでDMLが実行される場合は、DBMS_STATS
でそのパーティションの統計を再収集できないため、全表スキャンのみがグローバル統計を収集する手段となります。統計の再収集では、パフォーマンスにオーバーヘッドが生じます。
Oracle Database 12cでは、パーティションまたはサブパーティションの統計が失効しているかどうかを判別する方法が、統計プリファレンスのINCREMENTAL_STALENESS
で制御されます。このプリファレンスの値は、次のいずれかです。
USE_STALE_PERCENT
DMLの変更が表に対して指定したSTALE_PERCENT
プリファレンスを下回る場合はパーティションまたはサブパーティションが失効しているとはみなされません。STALE_PERCENT
のデフォルト値は10
です。これはDMLによって10%を超える行で変更が生じると、その表が失効しているとみなされることを意味します。
USE_LOCKED_STATS
ロックされたパーティションまたはサブパーティションの統計は、DMLの変更にかかわらず、失効しているとみなされることはありません。
NULL
(デフォルト)
DMLに変更が生じた場合は、パーティションまたはサブパーティションが失効しているとみなされます。この動作はOracle Database 11gの動作と同じです。デフォルト値を使用する場合、増分モードで収集される統計は非増分モードで収集される統計と同じであることが保証されます。デフォルト値以外が使用されると、増分モードで収集された統計は、非増分モードで収集された統計よりも精度が低くなる可能性があります。
USE_STALE_PERCENT
とUSE_LOCKED_STATS
は合わせて指定できます。たとえば、次のような無名ブロックを記述できます。
BEGIN DBMS_STATS.SET_TABLE_PREFS ( ownname => null , table_name => 't' , pname => 'incremental_staleness' , pvalue => 'use_stale_percent,use_locked_stats' ); END;
前提条件
このチュートリアルでは、次のことが前提となっています。
パーティション化された表のSTALE_PERCENT
が10
に設定されています。
INCREMENTAL
値はtrue
に設定されています。
表には、以前にINCREMENTAL
モードで収集された統計があります。
INCREMENTAL_STALENESS
の設定や統計のロックの有無、DMLの変更割合に応じて統計収集がどのように変化するのかを確認します。
失効したまたはロックされたパーティション統計のある表をテストする手順は次のとおりです。
INCREMENTAL_STALENESS
をNULL
に設定します。
その後、DMLアクティビティのため、1つのパーティションの5%の行が変更されます。
DBMS_STATS
を使用して表の統計を収集します。
DBMS_STATS
によって、5%のDMLアクティビティが含まれたパーティションの統計が再収集され、グローバル統計が増分的に維持されます。
INCREMENTAL_STALENESS
をUSE_STALE_PERCENT
に設定します。
その後、DMLアクティビティのため、1つのパーティションの5%の行が変更されます。
DBMS_STATS
を使用して表の統計を収集します。
DBMS_STATS
によって、DMLアクティビティが含まれていたパーティションの統計が再収集されることはなく(変更が10%の失効のしきい値を下回るため)、グローバル統計が増分的に維持されます。
パーティション統計をロックします。
その後、DMLアクティビティのため、1つのパーティションの20%の行が変更されます。
DBMS_STATS
を使用して表の統計を収集します。
統計がロックされているため、DBMS_STATS
によってパーティションの統計が再収集されることはありません。データベースでは、全表スキャンを使用してグローバル統計が収集されます。
その後、DMLアクティビティのため、1つのパーティションの5%の行が変更されます。
DBMS_STATS
を使用して表の統計を収集します。
この表の統計が収集される場合は、統計が失効しているとみなされないため、DBMS_STATS
ではパーティションの統計が再収集されません。データベースでは、このパーティションの既存の統計を使用してグローバル統計が増分的に維持されます。
INCREMENTAL_STALENESS
をUSE_LOCKED_STATS
およびUSE_STALE_PERCENT
に設定します。
その後、DMLアクティビティのため、1つのパーティションの20%の行が変更されます。
DBMS_STATS
を使用して表の統計を収集します。
USE_LOCKED_STATS
が設定されているため、DBMS_STATS
は、統計が失効している状態を無視し、ロックされた統計を使用します。データベースでは、このパーティションの既存の統計を使用してグローバル統計が増分的に維持されます。
関連項目:
DBMS_STATS.SET_TABLE_PREFS
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
システム統計は、オプティマイザに対してシステムのハードウェア特性(I/OとCPUのパフォーマンスおよび使用率など)を記述します。システム統計によって、オプティマイザはより効率的な実行計画を選択できるようになります。CPUの高速化やメモリーの増設、ディスク・ストレージの交換など、環境に物理的な変化が生じた場合は、システム統計を収集することをお薦めします。
システム統計を収集するには、DBMS_STATS.GATHER_SYSTEM_STATS
を使用します。データベースでシステム統計を収集する場合は、指定された期間のアクティビティを分析するか(作業負荷統計)、作業負荷をシミュレートします(非作業負荷統計)。DBMS_STATS.GATHER_SYSTEM_STATS
への入力引数には次があります。
NOWORKLOAD
オプティマイザによって、作業負荷とは無関係に、システムの特性のみに基づいた統計が収集されます。
INTERVAL
指定された時間(分)が経過すると、オプティマイザによって、データ・ディクショナリまたは代替の表のいずれか(stattab
で指定)のシステム統計が更新されます。統計は、指定された時間間隔のシステム・アクティビティに基づきます。
START
およびSTOP
START
は統計収集を初期化します。STOP
は、(START
以降の)経過期間の統計を算出し、データ・ディクショナリまたは代替の表(stattab
で指定)をリフレッシュします。オプティマイザではINTERVAL
は無視されます。
EXADATA
システム統計では、大きなI/Oサイズや高いI/Oスループットなど、Exadataを使用することで提供されるすぐれた機能が考慮されます。オプティマイザでは、CPU速度に加えて、マルチブロック読取りカウントやI/Oスループットの統計が設定されます。
表12-5には、DBMS_STATS
で収集されたオプティマイザのシステム統計のほか、特定のシステム統計を収集または手動設定するためのオプションが示されています。
表12-5 DBMS_STATパッケージ内のオプティマイザのシステム統計
パラメータ名 | 説明 | 初期化 | 統計の収集または設定のオプション | 単位 |
---|---|---|---|---|
|
作業負荷のない場合のCPU速度を表します。CPU速度は、1秒当たりのCPU平均サイクル数です。 |
システム起動時 |
|
100万/秒 |
|
ディスク・ヘッドがデータの読取り位置に移動する時間を表します。I/Oシーク時間は、シーク時間、待機時間およびオペレーティング・システム・オーバーヘッド時間を合計したものです。 |
システム起動時 10(デフォルト) |
|
ミリ秒 |
|
1回の読取りリクエストでOracleデータベースによるデータの読取りが可能な速度を表します。 |
システム起動時 4096(デフォルト) |
|
バイト/ミリ秒 |
|
作業負荷をかけた場合のCPU速度を表します。CPU速度は、1秒当たりのCPU平均サイクル数です。 |
なし |
|
100万/秒 |
|
最大I/Oスループットは、I/Oサブシステムが発揮できる最大スループットです。 |
なし |
|
バイト/秒 |
|
スレーブI/Oスループットは、パラレル実行サーバーの平均I/Oスループットです。 |
なし |
|
バイト/秒 |
|
単一ブロック読取り時間は、単一ブロックをランダムに読み取る平均時間です。 |
なし |
|
ミリ秒 |
|
マルチブロック読取りは、マルチブロックを順に読み取る平均時間です。 |
なし |
|
ミリ秒 |
|
マルチブロック・カウントは、平均マルチブロック順次読取りカウントです。 |
なし |
|
ブロック |
関連項目:
システム統計を実装するためのDBMS_STATSパッケージのプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
データベースでは、起動時にシステム統計の基本的な要素が自動収集されます。CPUおよびI/Oの特性は、多くの場合、長期にわたって変わりません。通常、これらの特性は構成でなんらかの状態がアップグレードされた場合にのみ変更されます。このため、CPUの高速化やメモリーの増設、ディスク・ストレージの交換など、環境に物理的な変化が生じた場合にのみ、システム統計を収集することをお薦めします。
次のガイドラインに留意してください。
非作業負荷統計は、インスタンスの初回起動時にデフォルト値で初期化されます。他のどの表領域でも使用されていない記憶域に新しい表領域を作成した場合は、非作業負荷統計を収集することをお薦めします。
システムの作業負荷が最も平均的なときの時間間隔で統計を取得することがベスト・プラクティスです。作業負荷統計の収集には、さらなるオーバーヘッドは発生しません。
データベースの作業負荷が最も標準的なときに、DBMS_STATS.GATHER_SYSTEM_STATS
を使用して統計を取得します。たとえば、データベースのアプリケーションで日中にOLTPトランザクションを処理し、夜間にOLAPレポートを生成できます。
作業負荷統計では、指定した期間のアクティビティを分析します。
作業負荷統計には、表12-5にリストされている次の統計が含まれています。
単一ブロック(sreadtim
)およびマルチブロック(mreadtim
)の読取り時間
マルチブロック・カウント(mbrc
)
CPU速度(cpuspeed
)
最大システム・スループット(maxthr
)
パラレル実行の平均スループット(slavethr
)
データベースでは、作業負荷の開始から終了までの間の、物理的な順次およびランダム読取りの数を比較して、sreadtim
、mreadtim
およびmbrc
を計算します。これらの値は、バッファ・キャッシュが同期読取りリクエストを完了したときに変更されるカウンタを通して実装されます。
このカウンタはバッファ・キャッシュ内にあるため、これらにはI/O遅延のほかに、ラッチの競合およびタスク・スイッチングに関連する待機も含まれます。したがって、作業負荷統計は、作業負荷ウィンドウ中のシステム・アクティビティに依存します。システムがI/Oバウンド(ラッチ競合およびI/Oスループットの両方)の場合は、データベースで統計を使用した後に、統計によってI/O集中を低減化する計画が促進されます。
図12-2に示すように、作業負荷統計を収集する場合には、オプティマイザでは、作業負荷統計のために収集されたmbrc
値が使用されて、全表スキャンのコストが見積られます。
作業負荷統計を収集する際に、一連の作業負荷の間に表のスキャンが行われない(OLTPシステムではよく発生します)場合は、mbrc
値およびmreadtim
値がデータベースで収集されない可能性があります。しかし、全表スキャンはDSSシステムで頻繁に行われています。これらのスキャンは並列に実行され、バッファ・キャッシュを経由しない場合があります。このようなケースでは、索引検索でバッファ・キャッシュを使用するため、データベースでもsreadtim
が収集されています。
mbrc
またはmreadtim
値を収集できないか、または収集してもそれらを検証できない場合、sreadtim
およびcpuspeed
値が収集されていると、sreadtim
およびcpuspeed
のみがコスト計算に使用されます。この場合、オプティマイザは初期化パラメータDB_FILE_MULTIBLOCK_READ_COUNT
の値を使用して全表スキャンを見積ることができます。ただし、DB_FILE_MULTIBLOCK_READ_COUNT
が0
であるか、設定されていない場合は、オプティマイザで値8
を使用してコストを計算します。
作業負荷統計を収集するには、DBMS_STATS.GATHER_SYSTEM_STATS
プロシージャを使用します。GATHER_SYSTEM_STATS
プロシージャでは、経過した期間に応じた統計を使用してデータ・ディクショナリまたはステージング表をリフレッシュします。収集する期間を設定するには、次の手法のいずれかを使用します。
作業負荷ウィンドウの開始にSTART
指定し、作業負荷ウィンドウの終了にSTOP
を指定します。
統計収集が自動的に停止する前に、INTERVAL
とその時間間隔(分単位)を指定します。必要な場合は、GATHER_SYSTEM_STATS (gathering_mode=>'STOP')
を使用することでスケジュールよりも早く収集を終了できます。
関連項目:
DB_FILE_MULTIBLOCK_READ_COUNT
初期化パラメータの詳細は、『Oracle Databaseリファレンス』を参照してください。
このチュートリアルでは、GATHER_SYSTEM_STATS
のSTART
パラメータとSTOP
パラメータを使用した作業負荷の時間間隔を設定する方法について説明します。
前提条件
このチュートリアルでは、次のことが前提となっています。
10 a.m.と11 a.m.の間の時間が毎日の作業負荷の標準時間です。
データ・ディクショナリにあるシステム統計を直接収集します。
STARTおよびSTOPを使用して作業負荷統計を収集する手順は次のとおりです。
SQL*Plusを起動し、管理者権限でデータベースに接続します。
統計収集を開始します。
たとえば、10 a.m.に次のプロシージャを実行して収集を開始します。
EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode => 'START' );
作業負荷を生成します。
統計収集を終了します。
たとえば、11 a.m.に次のプロシージャを実行して収集を終了します。
EXECUTE DBMS_STATS.GATHER_SYSTEM_STATS( gathering_mode => 'STOP' );
ここで、オプティマイザでは、作業負荷統計を使用して、日々の通常の作業負荷の間に有効な実行計画を生成できるようになります。
オプションで、システム統計を問い合せます。
たとえば、次の問合せを実行します。
COL PNAME FORMAT a15 SELECT PNAME, PVAL1 FROM SYS.AUX_STATS$ WHERE SNAME = 'SYSSTATS_MAIN';
関連項目:
DBMS_STATS.GATHER_SYSTEM_STATSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
このチュートリアルでは、GATHER_SYSTEM_STATS
のINTERVAL
パラメータを使用した作業負荷の時間間隔を設定する方法について説明します。
前提条件
このチュートリアルでは、次のことが前提となっています。
データベースのアプリケーションで日中にOLTPトランザクションを処理し、夜間にOLAPレポートを実行します。代表的な統計を収集するには、日中の2時間と夜間の2時間で収集します。
workload_stats
という名前の表に統計を格納します。
収集された統計間の切替えを行います。
INTERVALを使用して作業負荷統計を収集する手順は次のとおりです。
SQL*Plusを起動して、本番データベースに管理者dba1
として接続します。
本番統計を保持するための表を作成します。
たとえば、次のPL/SQLプログラムを実行して、ユーザー統計表workload_stats
を作成します。
BEGIN DBMS_STATS.CREATE_STAT_TABLE ( ownname => 'dba1' , stattab => 'workload_stats' ); END; /
JOB_QUEUE_PROCESSES
が0
でないことを確認して、DBMS_JOB
ジョブとOracle Schedulerジョブが実行されるようにします。
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 1;
日中の間に統計を収集します。
たとえば、次のプログラムを使用して2時間分の統計を収集します。
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS ( interval => 120 , stattab => 'workload_stats' , statid => 'OLTP' ); END; /
夜の間に統計を収集します。
たとえば、次のプログラムを使用して2時間分の統計を収集します。
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS ( interval => 120 , stattab => 'workload_stats' , statid => 'OLAP' ); END; /
日中または夜に、適切な統計をデータ・ディクショナリにインポートします。
たとえば、日中に次のプログラムを使用して、ステージング表からディクショナリにOLTP統計をインポートできます。
BEGIN DBMS_STATS.IMPORT_SYSTEM_STATS ( stattab => 'workload_stats' , statid => 'OLTP' ); END; /
たとえば、夜の間に次のプログラムを使用して、ステージング表からディクショナリにOLAP統計をインポートできます。
BEGIN DBMS_STATS.IMPORT_SYSTEM_STATS ( stattab => 'workload_stats' , statid => 'OLAP' ); END; /
関連項目:
DBMS_STATS.GATHER_SYSTEM_STATS
プロシージャの詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください
非作業負荷統計ではI/Oシステムの特性を取得します。デフォルトでは、Oracle Databaseで非作業負荷統計とCPUコスト・モデルが使用されます。非作業負荷統計の値は、インスタンスの初回起動時にデフォルトで初期化されます。また、DBMS_STATS.GATHER_SYSTEM_STATS
プロシージャを使用して、非作業負荷統計を手動で収集できます。
非作業負荷統計には、表12-5にリストされている次のシステム統計が含まれています。
I/O転送速度(iotfrspeed
)
I/Oシーク時間(ioseektim
)
CPU速度(cpuspeednw
)
作業負荷統計と非作業負荷統計の主な違いは、収集方法にあります。非作業負荷統計ではすべてのデータ・ファイルに対してランダムな読取りを実行してデータを収集する一方で、作業負荷統計ではデータベース・アクティビティが発生した際に更新されるカウンタを使用します。作業負荷統計を収集する場合には、Oracle Databaseでは非作業負荷統計ではなく作業負荷統計が使用されます。
非作業負荷統計を収集するには、引数を含まないか、収集モードをnoworkload
に設定した状態でDBMS_STATS.GATHER_SYSTEM_STATS
を実行します。非作業負荷統計の収集プロセスの際に、I/Oシステムにオーバーヘッドが発生します。この収集プロセスは、I/Oのパフォーマンスおよびデータベースのサイズによって数秒から数分かかることがあります。
非作業負荷統計を収集した場合は、データベースでその情報が分析され、その整合性が検証されます。場合によっては、非作業負荷統計の値がデフォルト値のままになることがあります。再び統計を収集するか、またはSET_SYSTEM_STATS
を使用してその値をI/Oシステムの仕様に手動設定するかのいずれが可能です。
前提条件
このチュートリアルでは、非作業負荷統計を手動で収集するものとします。
非作業負荷統計を手動収集する手順は次のとおりです。
SQL*Plusを起動し、管理者権限でデータベースに接続します。
非作業負荷統計を収集します。
たとえば、次の文を実行します。
BEGIN DBMS_STATS.GATHER_SYSTEM_STATS ( gathering_mode => 'NOWORKLOAD' ); END;
オプションで、システム統計を問い合せます。
たとえば、次の問合せを実行します。
COL PNAME FORMAT a15 SELECT PNAME, PVAL1 FROM SYS.AUX_STATS$ WHERE SNAME = 'SYSSTATS_MAIN';
関連項目:
DBMS_STATS.GATHER_SYSTEM_STATSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
DBMS_STATS.DELETE_SYSTEM_STATS
ファンクションを使用してシステム統計を削除します。このプロシージャではINTERVAL
またはSTART
およびSTOP
の各オプションを使用して収集された作業負荷統計が削除され、デフォルト値が非作業負荷統計にリセットされます。ただし、stattab
パラメータで統計を格納する表が指定されている場合は、サブプログラムによって、関連するstatid
を持つすべてのシステム統計が統計表から削除されます。
前提条件
このチュートリアルでは、次のことが前提となっています。
特定の集中型の作業負荷の統計を収集しましたが、オプティマイザでそれらの統計が使用されないようにします。
ユーザーが指定した表ではなく、デフォルトの場所に作業負荷統計が格納されています。
システム統計を削除する手順は次のとおりです。
SQL*Plusを起動して、管理権限を持つユーザーとしてデータベースに接続します。
システム統計を削除します。
たとえば、次の文を実行します。
EXEC DBMS_STATS.DELETE_SYSTEM_STATS;
関連項目:
DBMS_STATS.DELETE_SYSTEM_STATSプロシージャの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。