22

あなたの経験では、Oracle データベース統計はどのくらいの頻度で実行する必要がありますか? 私たちの開発者チームは最近、統計が 2 か月半以上実稼働ボックスで実行されていないことを発見しました。私には長い時間のように思えますが、私は DBA ではありません。

4

9 に答える 9

19

Oracle 11g の統計はデフォルトで自動的に収集されるため。

Oracle Databaseのインストール時に、次の2つのスケジューラ・ウィンドウが事前定義されています。

  • WEEKNIGHT_WINDOW は、毎週月曜日から金曜日の午後 10 時に開始し、午前 6 時に終了します。
  • WEEKEND_WINDOW は、土曜と日曜の丸一日をカバーします。

統計が最後に収集されたのはいつですか?

SELECT owner, table_name, last_analyzed FROM all_tables ORDER BY last_analyzed DESC NULLS LAST; --Tables.
SELECT owner, index_name, last_analyzed FROM all_indexes ORDER BY last_analyzed DESC NULLS LAST; -- Indexes.

自動統計収集の状況は?

SELECT * FROM dba_autotask_client WHERE client_name = 'auto optimizer stats collection';

Windows グループ?

SELECT window_group_name, window_name FROM dba_scheduler_wingroup_members;

ウィンドウスケジュール?

SELECT window_name, start_time, duration FROM dba_autotask_schedule;

このスキーマでデータベース統計を手動で収集します。

EXEC dbms_stats.gather_schema_stats(ownname=>NULL, cascade=>TRUE); -- cascade=>TRUE means include Table Indexes too.

すべてのスキーマのデータベース統計を手動で収集してください!

-- Probably need to CONNECT / AS SYSDBA
EXEC dbms_stats.gather_database_stats;
于 2013-05-24T18:32:51.203 に答える
14

データが「大幅に」変更されたとき。

テーブルが 1 行から 200 行になった場合、それは大きな変化です。テーブルが 100,000 行から 150,000 行になったとしても、それほど大きな変化ではありません。テーブルが、一般的にクエリされる列 X にすべて同一の値を持つ 1000 行から、列 X にほぼ一意の値を持つ 1000 行になると、それは大きな変化です。

統計には、項目数と相対頻度に関する情報が格納されます。これにより、特定の条件に一致する行数を「推測」できます。推測が間違っている場合、オプティマイザは非常に最適ではないクエリ プランを選択する可能性があります。

于 2008-09-17T02:47:43.510 に答える
13

私の最後の仕事では、週に 1 回統計を実行していました。私の記憶が正しければ、木曜日の夜にそれらをスケジュールし、金曜日に DBA は実行時間の長いクエリを注意深く監視して、予期せぬ事態が発生しないようにしました。(金曜日が選ばれたのは、コード リリースの直後であることが多く、トラフィックがかなり少ない日である傾向があったためです。) 悪いクエリを見つけたとき、より良いクエリ プランを見つけて保存し、予期せず再度変更されないようにしました。 . (Oracleにはこれを自動的に行うツールがあり、最適化するクエリを指示すると実行されます。)

多くの組織は、不適切なクエリ プランが予期せずポップアップすることを恐れて、統計の実行を避けています。しかし、これは通常、時間の経過とともにクエリ プランが悪化することを意味します。統計を実行すると、多くの問題が発生します。これらの問題を修正するための結果的なスクランブルは、統計を実行することの危険性に対する彼らの恐れを裏付けています。しかし、統計を定期的に実行し、想定どおりに監視ツールを使用し、発生した問題を修正すれば、頭痛の種は少なくなり、一度にすべての問題に遭遇することもありません。

于 2008-09-18T05:44:52.047 に答える
5

使用している Oracle のバージョンは何ですか? Oracle 10 について言及しているこのページを確認してください。

http://www.acs.ilstu.edu/docs/Oracle/server.101/b10752/stats.htm

それは言います:

統計を収集するための推奨される方法は、Oracle が自動的に統計を収集できるようにすることです。Oracle は、すべてのデータベース オブジェクトの統計を自動的に収集し、定期的にスケジュールされたメンテナンス ジョブでそれらの統計を維持します。

于 2008-09-17T03:06:02.157 に答える
2

Oracle の 10g 以降のバージョンでは、オプティマイザが「適切な」実行計画を決定するために、テーブルとインデックスに関する最新の統計が必要です。統計を収集する頻度は難しい問題です。これは、アプリケーション、スキーマ、データ レート、およびビジネス プラクティスによって異なります。古いバージョンのオラクルと下位互換性を持つように作成された一部のサードパーティ製アプリは、新しいオプティマイザではうまく機能しません。これらのアプリケーションでは、データベースがルールベースの実行計画に戻るように、テーブルに統計がないことが必要です。しかし、平均的にオラクルは、古い統計を持つテーブルで統計を収集することを推奨しています。テーブルを監視するように設定し、その状態をチェックして、古いかどうか/いつ古いかを分析させることができます。多くの場合、それで十分ですが、そうでない場合もあります。それは本当にデータベースに依存します。私のデータベースには、パフォーマンスを維持するために夜間の統計収集が必要な一連の OLTP テーブルがあります。他のテーブルは週に 1 回分析されます。大規模な dw データベースでは、テーブルが大きすぎて定期的な分析ができないため、全体的なデータベースの負荷とパフォーマンスに影響を与えることなく、必要に応じて分析します。したがって、正しい答えは、アプリケーション、データの変更、およびビジネス ニーズに依存するということです。

于 2009-03-10T15:13:04.283 に答える
2

私が Oracle に支援された大規模なマルチユーザー計画システムを管理していたとき、DBA は統計を収集する毎週の仕事をしていました。また、統計に影響を与える、または影響を受ける可能性のある重要な変更をロールアウトした場合、状況に追いつくためにジョブを強制的にサイクルから外しました。

于 2008-09-17T03:10:45.047 に答える
1

新しい統計がクエリプランに望ましくない変更を引き起こすリスクと、古い統計自体がクエリプランを変更するリスクとのバランスをとるようにしてください。

テーブルISSUEと列CREATE_DATEを持つバグデータベースがあり、列の値が多かれ少なかれ単調に増加するとします。ここで、この列にヒストグラムがあり、この列の値が2008年1月1日から2008年9月17日まで均一に分布していることをOracleに示していると仮定します。これにより、オプティマイザは合理的に行数を見積もることができます。先週(つまり、9月7日から13日)に作成されたすべての問題を探していた場合は返されます。ただし、アプリケーションが引き続き使用され、統計が更新されない場合、このヒストグラムの精度はますます低くなります。したがって、オプティマイザは、「先週作成された問題」に対するクエリの精度が時間の経過とともに低下することを期待し、最終的にOracleがクエリプランを否定的に変更する可能性があります。

于 2008-09-17T20:18:16.247 に答える
0

データ ウェアハウス タイプのシステムの場合、統計をまったく収集せず、動的サンプリングに依存することを検討できます (optimizer_dynamic_sampling をレベル 2 以上に設定します)。

于 2009-03-08T13:34:18.360 に答える
0

一般に、データベースで大量の挿入や大きなデータの変更が頻繁に発生するなどの強い正当な理由がない限り、データベース全体で頻繁に統計を収集することはお勧めしません。この頻度でデータベースの統計を収集すると、クエリの実行計画が新しい不適切な実行計画に変更される可能性があります。これにより、新しい不適切な計画の影響を受けるすべてのクエリを調整しようとすると、多くの時間がかかる可能性があります。これが、収集の影響をテストする必要がある理由です。テストデータベースで新しい統計を収集する場合、またはそのための時間や人的資源がない場合は、少なくとも新しい統計を収集する前に元の統計をバックアップしてフォールバック計画を維持する必要があります。新しい統計を取得した後、クエリが期待どおりに実行されなかった場合は、元の統計を簡単に復元できます。

元の統計をバックアップして新しい統計を収集し、新しい統計を収集した後に期待どおりに進まなかった場合に元の統計を復元するために使用できる SQL コマンドを提供するのに役立つ非常に便利なスクリプトがあります。このリンクでスクリプトを見つけることができます: http://dba-tips.blogspot.com/2014/09/script-to-ease-gathering-statistics-on.html

于 2014-09-22T11:54:35.787 に答える