2017-03-02 5 views
1

私は、Oracleデータベースのテーブルとインデックスの統計情報を収集することについていくつかの読書を行ってきましたが、残念です。Oracle SQLのテーブルとインデックスの統計

議論のために、Oracle 11gR2をRDBMSとしましょう。テーブルとインデックスの統計情報の収集に関しては、それをいつ実行するのが好ましいか、Oracleは本当に自動的に必要な統計を収集していますか?

最初の点について:いつ実行する必要がありますか。私は、経験則として、テーブルを分析した最後の時間以来、テーブルのレコードの約10%が変更(挿入、更新など)された後にテーブルとインデックスの統計情報を収集する必要があることを読んだことがあります。

第2の点については、これが好ましい方法です。表と索引統計の両方を計算する場合は、表がパーティション化されていないと仮定して、デフォルト・オプションを指定してDBMS_STATS.GATHER_TABLE_STATSを実行しますか?

第3の点について:オラクルは実際に必要な統計を実際に収集していますか?これが当てはまる場合、私はテーブル統計を収集することを心配してはいけませんか(ポイント1と2を参照)?

ありがとうございます。

EDIT:ammoQによってコメントに続き、私は質問には、ユースケースは本当にここに、あるものでは明確ではないことに気づきました。私の質問は、データベース操作によって通常実行されるプロシージャを介してではなく、ユーザーのアクション、つまり手動で「操作」されていないテーブルに関するものです。たとえば、私の例を挙げる。私のETLプロセスは、毎日いくつかのテーブルをロードし、約1時間でそれを行います。その1時間のうち、約半分がテーブル自体の分析に費やされます。したがって、表領域は挿入または更新後に毎日分析されます。これは残酷なので、問題と思われます。

+0

いつ実行する必要がありますか:クエリオプティマイザが悪い計画を選択したことに気付いたときに、最低限です。 ;-) –

+0

コメントありがとうございます。私はその質問を明確にした。 – DylanW80

+0

テーブルの統計情報を収集するautotasks:https://asktom.oracle.com/pls/asktom/f?p=100:11:0:::P11_QUESTION_ID:1133388300346992024 –

答えて

2

一般的に、正確なものではなく代表的な統計を持つ必要があり、正しい実行計画が得られます。デフォルトでは、Oracleは夜間のバッチ・ウィンドウ中に統計収集ジョブを実行します。これは一部のアプリケーションでは問題ありませんが、通常はデータロードプロセスを含むデータウェアハウスがある場合は、そのプロセスの一部として統計情報を管理する必要があります。私は統計を収集するのではなく「管理する」と言いました。それは、単に統計を収集するだけでなく、統計のための他のオプションがあることを言っている私の方法ですが、統計を収集することは私が始めるところにあるでしょう。 統計収集、増分統計などを最適化するために実行できることもあります。 非常にという重要なことは、統計を収集するときにAUTOサンプルサイズを使用することです。パーセンテージを指定しないでください。100%ではありません。その理由は、自動サンプルサイズでは、AUTOサンプルサイズを使用しない場合に無効化される多数の内部最適化と機能が有効になります。

だから、あなたの特定のポイントを取って

  1. 10%の古さはかなりランダムであり、かつ自動統計によって使用されるだけの数です。
  2. dbms_stats.gather_table_stats()のデフォルト値はです。好ましい方法はです。私が変えるかもしれない1つのパラメタは、統計収集を並行して有効にするためにDEGREEになります。
  3. In 12c、basic統計情報は空のテーブル(または空のパーティション)に集められます。インデックスは、インデックスが作成されるときにインデックス上に構築されます。私が上記のことを繰り返し述べるために、統計収集はあなたのELTプロセスの一部でなければなりません。

私はそれが意味を成して助けてくれることを願っています。

+0

回答ありがとうございます、@BobC。私に最も気になるのは、統計を収集することが自分のETLプロセスで最も時間がかかることです。元の投稿の最後の編集で述べたように、ETLプロセス自体に費やされる時間の約半分が統計の収集に費やされます。これは、(数千万)行の最大のテーブルで特に当てはまります。貴重な秒や分を搾り取ることができるかどうかを、DEGREEのさまざまなレベルで試してみます。 – DylanW80

+0

@ DylanW80あなたはどのようなハードウェアを持っていますか?すなわち、いくつのCPUコアとどれくらいのIO帯域幅があるのでしょうか?インデックス付きの列に統計情報を集めるだけではありません。あなたはすべてのことに関する統計が必要です。空のテーブルに読み込んでいるのですか、または既に読み込まれていますか?あなたの10Mの行テーブルはパーティション化されていますか? – BobC

+0

残念ながら、私は実際にデータベースが置かれているハードウェアの詳細を知らない。私は経験から、それが比較的「速い」ことだけを知っています。テーブルにはすでに値が設定されています。毎日私は前日からのデータを挿入します。テーブルは分割されていません。私はこれをやろうとしましたが、私は実際にパーティション "キー"/"戦略"を持っていません(意味があれば) – DylanW80

関連する問題