ANALYZE
目的
ANALYZE文を使用すると、統計情報を収集して、次のような操作を実行できます。
-
索引または索引パーティション、表または表パーティション、索引構成表、クラスタまたはスカラー・オブジェクト属性の統計情報を収集または削除します。
-
索引または索引パーティション、表または表パーティション、索引構成表、クラスタまたはオブジェクト参照(
REF)の構造を検証します。 -
表またはクラスタの移行行と連鎖行を識別します。
ノート:
オプティマイザ統計の収集でのANALYZEの使用はサポートされなくなりました。
オプティマイザ統計の収集が必要な場合は、DBMS_STATSパッケージを使用してパラレルで統計を収集し、パーティション化されたオブジェクトのグローバル統計を収集できます。これにより、他の方法で統計収集を微調整できます。DBMS_STATSパッケージの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。
ANALYZE文は、次の場合にのみ使用してください。
-
VALIDATE句、LISTCHAINEDROWS句の使用 -
空きリスト・ブロックの情報を収集する場合
前提条件
分析するスキーマ・オブジェクトがローカルである必要があります。自分のスキーマ内にない場合は、ANALYZE ANYシステム権限が必要です。
表またはクラスタの連鎖行をリスト表へ入れる場合、このリスト表が自分のスキーマ内にある必要があります。自分のスキーマ内にない場合は、そのリスト表のINSERT権限またはINSERT ANY TABLEシステム権限が必要です。
パーティション表の妥当性チェックを行う場合は、分析したROWIDを入れる表に対するINSERTオブジェクト権限またはINSERT ANY TABLEシステム権限が必要です。
構文
analyze::=
partition_extension_clause::=
validation_clauses::=
into_clause::=
セマンティクス
schema
表、索引またはクラスタが含まれているスキーマを指定します。schemaを指定しない場合、表、索引またはクラスタは自分のスキーマ内にあるとみなされます。
TABLE table
分析する表を指定します。表を分析すると、すべてのファンクション索引に発生する式について統計情報が収集されます。したがって、表を分析する前に、必ずファンクション索引を作成してください。ファンクション索引の詳細は、「CREATE INDEX」を参照してください。
表を分析すると、LOADINGまたはFAILEDのマークが付いたドメイン索引はすべてスキップされます。
索引構成表の場合、マッピング表が分析され、そのPCT_ACCESSS_DIRECT統計情報も計算されます。これらの統計情報は、マッピング表のローカルROWIDの一部として格納されたと推測されるデータ・ブロック・アドレスの精度を評価します。
表については、次の統計情報が収集されます。アスタリスクが付いた統計情報は、常に厳密に計算されます。表の統計情報(ドメイン索引の状態を含む)は、データ・ディクショナリ・ビューUSER_TABLES、ALL_TABLESおよびDBA_TABLESのカッコで示す列に表示されます。
-
行数(
NUM_ROWS) -
最高水位標を下回るデータ・ブロックの数(現在データを含むか含まないかにかかわらず、データを格納するようにフォーマットされているデータ・ブロックの数)(
BLOCKS)* -
未使用の表に対して割り当てられているデータ・ブロックの数(
EMPTY_BLOCKS)* -
各データ・ブロックにおける使用可能な空き領域サイズの平均値(バイト単位)(
AVG_SPACE) -
連鎖行の数(
CHAIN_COUNT) -
行のオーバーヘッドを含む、バイト単位での行の平均の長さ(
AVG_ROW_LEN)
表の分析の制限事項
表の分析には、次の制限事項があります。
-
ANALYZEを使用して、データ・ディクショナリ表の統計情報を収集しないでください。 -
ANALYZEを使用して、外部表の統計情報を収集しないでください。かわりに、DBMS_STATSパッケージを使用する必要があります。 -
ANALYZEを使用して、一時表のデフォルト統計情報を収集しないでください。ただし、すでに一時表の1つ以上の列とユーザー定義統計タイプを対応付けている場合、ANALYZEを使用して一時表のユーザー定義統計情報を収集できます -
REF列型、VARRAY、ネストした表、LOB列型(LOB列型は分析されずにスキップされる)、LONG列型、オブジェクト型などの列型の統計情報は計算または推定できません。ただし、このような列に統計タイプが対応付けられている場合は、ユーザー定義統計情報が収集されます。
関連項目:
-
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
partition_extension_clause
統計情報を収集するパーティションまたはサブパーティション、あるいはパーティション値またはサブパーティション値を指定します。クラスタの分析時にこの句は使用できません。
tableがコンポジット・パーティションのときにPARTITIONを指定した場合、指定したパーティション内ですべてのサブパーティションが分析されます。
INDEX index
索引については、次の統計情報が収集されます。アスタリスクが付いた統計情報は、常に厳密に計算されます。従来索引について統計情報を計算または推定する場合、統計情報は、データ・ディクショナリ・ビューUSER_INDEXES、ALL_INDEXESおよびDBA_INDEXESのカッコで示す列に表示されます。
-
ルート・ブロックからリーフ・ブロックまでの索引の深さ(
BLEVEL)* -
リーフ・ブロックの数(
LEAF_BLOCKS) -
個別索引値の数(
DISTINCT_KEYS) -
索引の値ごとのリーフ・ブロックの平均数(
AVG_LEAF_BLOCKS_PER_KEY) -
(表に対する索引の)索引の値ごとのデータ・ブロックの平均数(
AVG_DATA_BLOCKS_PER_KEY) -
クラスタ係数(索引付きの値についての行が、どれだけ効率的に順序付けられているか)(
CLUSTERING_FACTOR)
ドメイン索引の場合、索引に関連付けられた統計タイプで指定したユーザー定義統計収集ファンクションが、この文によって起動されます(「ASSOCIATE STATISTICS」を参照)。ドメイン索引に関連付けられた統計タイプがない場合、その索引タイプに関連付けられた統計タイプが使用されます。索引またはその索引タイプの統計タイプがない場合、ユーザー定義統計情報は収集されません。ユーザー定義索引統計情報は、データ・ディクショナリ・ビューUSER_USTATS、ALL_USTATSおよびDBA_USTATSのSTATISTICS列に表示されます。
ノート:
-
多数の行が削除されている索引を分析する場合、統計情報操作として
ESTIMATEを要求しても、COMPUTE統計情報操作が実行され、全表スキャンが行われることがあります。このような操作は、非常に時間がかかる場合があります。 -
ANALYZE文で索引を分析すると、完了までかなりの時間がかかる場合があります。この場合、SQL問合せを使用して索引を検証できます。問合せにより表と索引間に不整合があると判定された場合、索引を詳細に分析するためにANALYZE文を使用できます。詳細は、『Oracle Database管理者ガイド』を参照してください。
索引の分析の制限事項
IN_PROGRESSまたはFAILEDのマークが付けられたドメイン索引は分析できません。
関連項目:
-
ドメイン索引の詳細は、「CREATE INDEX」を参照してください。
-
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
CLUSTER cluster
分析するクラスタを指定します。クラスタの統計情報を収集すると、すべてのクラスタ表、およびクラスタ索引を含むすべての索引の統計情報も自動的に収集されます。
索引クラスタとハッシュ・クラスタには、単一クラスタ・キー(AVG_BLOCKS_PER_KEY)が使用するデータ・ブロックの平均数が収集されます。これらの統計情報は、データ・ディクショナリ・ビューALL_CLUSTERS、USER_CLUSTERSおよびDBA_CLUSTERSに表示されます。
関連項目:
データ・ディクショナリ・ビューの詳細は、『Oracle Databaseリファレンス』および「クラスタの分析: 例」を参照してください。
validation_clauses
validation_clausesを使用すると、REF値および分析したオブジェクトの構造を検証できます。
関連項目:
表、索引、クラスタおよびマテリアライズド・ビューの検証の詳細は、『Oracle Database管理者ガイド』を参照してください。
VALIDATE REF UPDATEを指定すると、指定した表内のREF値の妥当性チェックを行って、個々のREFのROWID部分を検査し、真のROWIDと比較して、必要に応じて修正できます。この句を使用できるのは、表を分析する場合のみです。
表の所有者が参照先オブジェクトに対するREADまたはSELECTオブジェクト権限を持っていない場合、このオブジェクトは無効とみなされ、NULLに設定されます。その結果、オブジェクトに対して適切な権限を持つユーザーによって発行された問合せであっても、問合せでこれらのREF値を使用することはできません。
SET DANGLING TO NULLを指定すると、指定した表内のREF値が(範囲が限定されるかどうかにかかわらず)無効なオブジェクトまたは存在しないオブジェクトを指している場合に、REF値がNULLに設定されます。
VALIDATE STRUCTUREを指定すると、分析対象オブジェクトの構造を検証できます。この句で収集された統計情報はOracle Databaseオプティマイザでは使用されません。
関連項目:
-
表に対して、それぞれのデータ・ブロックと行の整合性が検証されます。索引構成表の場合、表の主キー索引に対する圧縮統計情報(最適なプレフィックス圧縮件数)も生成されます。
-
クラスタに対して、自動的にクラスタ表の構造が検証されます。
-
パーティション表の場合、行が適切なパーティションに属するかどうかが検証されます。行が正しく照合されなかった場合は、ROWIDが
INVALID_ROWS表に挿入されます。 -
一時表に対して、現行のセッション中に表の構造および索引が検証されます。
-
索引に対して、索引のそれぞれのデータ・ブロックの整合性が検証され、ブロックの破損がチェックされます。この句は、表のそれぞれの行が索引エントリを持っていること、またはそれぞれの索引エントリが表の行を指していることを確認するわけではありません。これらを確認する場合は、CASCADE句を使用して表の構造を検証します。
通常のすべての索引用の圧縮統計情報(最適なプレフィックス圧縮件数)も計算されます。
索引の統計情報は、データ・ディクショナリ・ビュー
INDEX_STATSおよびINDEX_HISTOGRAMに格納されます。関連項目:
これらのビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
オブジェクトの構造に障害がある場合は、エラー・メッセージが戻ります。この場合、オブジェクトを削除して作成しなおす必要があります。
CASCADE
CASCADEを指定すると、表またはクラスタに関連付けられた索引の構造を検証できます。表を検証するときにこの句を指定すると、その表に定義された索引も検証されます。クラスタを検証するときにこの句を指定した場合、クラスタ表のすべての索引(クラスタ索引を含む)が検証されます。
デフォルトでは、CASCADEを指定すると完全な検証(COMPLETE)が実行されますが、この処理はリソースを大量に消費する可能性があります。FASTを指定すると、破損の有無の検査が行われますが、破損の詳細はレポートされません。FASTを指定したときに破損が検出された場合は、CASCADEオプションをFAST句なしで使用すると、破損の場所を特定してその詳細を知ることができます。
この句を使用して使用可能な(以前は使用禁止であった)ファンクション索引を検証すると、検証エラーになる場合があります。この場合は、索引を再構築する必要があります。
ONLINEを指定すると、Oracle DatabaseがオブジェクトのDML操作中に検証を実行できるようになります。データベースは、並行して操作が行える程度に、実行する検証の量を減らします。
ノート:
OFFLINE指定でオブジェクトの構造を検証する場合と同様に、ONLINE指定でオブジェクトの構造を検証する場合、Oracle Databaseは統計情報を収集しません。
OFFLINEを指定すると、実行する検証の量が最大になります。この設定は、検証中にINSERT、UPDATEおよびDELETE文がオブジェクトに平行してアクセスすることを防ぎますが、問合せは許可されます。これはデフォルトです。
ONLINEの制限事項
クラスタを分析するときには、ONLINEを指定できません。
INTO
VALIDATE STRUCTUREのINTO句は、パーティション表のみに有効です。正しく照合されなかった行を持つパーティションのROWIDを格納するリスト表を指定します。schemaを指定しない場合、リストは自分のスキーマ内にあるとみなされます。この句自体を指定しない場合、表の名前はINVALID_ROWSになります。この表を作成するために使用するSQLスクリプトはUTLVALID.SQLです。
LIST CHAINED ROWS
LIST CHAINED ROWSを指定すると、分析した表またはクラスタの移行行および連鎖行を識別できます。索引の分析時にこの句は使用できません。
INTO句には、移行行および連鎖行をリストする表を指定します。schemaを指定しない場合、連鎖行表は自分のスキーマ内にあるとみなされます。この句自体を指定しない場合、表の名前はCHAINED_ROWSになります。連鎖行表は、ローカル・データベース内にある必要があります。
次のいずれかのスクリプトを使用して、CHAINED_ROWS表を作成できます。
-
UTLCHAIN.SQL: 物理ROWIDを使用します。そのため、行は、索引構成表からではなく従来表から収集されます。(次の注意を参照。) -
UTLCHN1.SQL: ユニバーサルROWIDを使用します。そのため、行は、従来表および索引構成表の両方から収集されます。
独自の連鎖行表を作成する場合、この2つのスクリプトのいずれかで規定されるフォーマットに従う必要があります。
分析対象の索引構成表が、ユニバーサルROWIDではなく主キーに基づくものである場合は、表の主キーを格納するために、索引構成表ごとに別の連鎖行表を作成する必要があります。SQLスクリプトDBMSIOTC.SQLおよびPRVTIOTC.PLBを使用してBUILD_CHAIN_ROWS_TABLEプロシージャを定義してから、このプロシージャを実行して、索引構成表ごとにIOT_CHAINED_ROWS表を作成します。
関連項目:
-
パッケージ化されたSQLスクリプトの詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』の
DBMS_IOTパッケージを参照してください。
DELETE STATISTICS
DELETE STATISTICSを指定すると、現在データ・ディクショナリに格納されている、分析したオブジェクトの統計情報を削除できます。Oracle Databaseに統計情報を使用させないようにする場合、この文を使用します。
表を指定してこの句を使用した場合、指定した表に定義されたすべての索引の統計情報も自動的に削除されます。クラスタを指定してこの句を使用した場合、指定したクラスタのすべての表、およびこれらの表のすべての索引(クラスタ索引を含む)の統計情報も自動的に削除されます。
ユーザー定義統計情報ではなく、システム統計情報のみを削除する場合は、SYSTEMを指定します。SYSTEMを指定しないと、オブジェクトのユーザー定義列または索引統計情報が収集された場合、データベースは、統計情報を収集するために使用された情報タイプに指定されている統計削除ファンクションを起動して、ユーザー定義統計情報も削除します。
関連項目:
例
統計情報の削除: 例
次の文は、サンプル表oe.ordersとデータ・ディクショナリにあるそのすべての索引の統計情報を削除します。
ANALYZE TABLE orders DELETE STATISTICS;
索引の分析: 例
次の文は、サンプル索引oe.inv_product_ixの構造を検証します。
ANALYZE INDEX inv_product_ix VALIDATE STRUCTURE;
表の検証: 例
次の文は、サンプル表hr.employeesおよびそのすべての索引を分析します。
ANALYZE TABLE employees VALIDATE STRUCTURE CASCADE;
表の場合は、VALIDATE REF UPDATE句を指定すると、指定した表内のREF値が検証され、REF値それぞれのROWID部分が検査された後で、真のROWIDと比較されます。その結果、ROWIDが誤っていることが判明した場合は、ROWID部分が正しくなるようにREFが更新されます。
次の文は、サンプル表oe.customersのREF値を検証します。
ANALYZE TABLE customers VALIDATE REF UPDATE;
次の文は、DML操作を同時に実行することを許可して、サンプル表oe.customersの構造を検証します。
ANALYZE TABLE customers VALIDATE STRUCTURE ONLINE;
クラスタの分析: 例
次の文は、personnelクラスタ(「クラスタの作成: 例」で作成)、そのすべての表、クラスタ索引を含むすべての索引を分析します。
ANALYZE CLUSTER personnel
VALIDATE STRUCTURE CASCADE; 連鎖行のリスト: 例
次の文は、表ordersのすべての連鎖行に関する情報を収集します。
ANALYZE TABLE orders LIST CHAINED ROWS INTO chained_rows;
前述の文では、情報は表chained_rowsに格納されます。次の問合せでその行を検証できます(表に連鎖行が含まれない場合は、行は戻されません)。
SELECT owner_name, table_name, head_rowid, analyze_timestamp
FROM chained_rows
ORDER BY owner_name, table_name, head_rowid, analyze_timestamp;
OWNER_NAME TABLE_NAME HEAD_ROWID ANALYZE_TIMESTAMP
---------- ---------- ------------------ -----------------
OE ORDERS AAAAZzAABAAABrXAAA 25-SEP-2000 


