0

前の質問で、Oracleの統計についてコメントがありました。

Oracleは、50Mが行数よりも大きいことを認識していません。確かに、それは統計を持っていますが、それらは古くて間違っている可能性があります-そしてOracleは統計が間違っているという理由だけで間違った結果を提供することを決して許しません

Oracleは、クエリ実行プランを作成するときに統計に依存していると確信していました。バージョン10より前では、統計を時々更新することが推奨されており、10gからOracleは統計を自動的に収集します。

Oracleクエリアナライザが統計データにどれだけ依存しているかを誰かが説明できますか?

4

3 に答える 3

3

Oracleは統計を頻繁に使用して、クエリ実行プランを生成します。それがしない(そしてすべきではない)のは、クエリ結果に影響を与える方法でそれらの統計を使用することです。これは、「ROWNUM<50000000」で実行しようとしていたことです。統計が古くなっているか、欠落している可能性があります。ただし、これは、Oracleが正しい結果を生成するのに時間がかかる可能性があることを意味するだけであり、Oracleが誤った結果を返すことを意味するものではありません。

Oracleが期待どおりに機能した場合、テーブルに60,000,000行が含まれていても、「ROWNUM <50000000」は「すべての行を取得」を意味すると判断する可能性があります(ただし、49,000,000行しか含まれていないという古い統計があります)。幸いなことに、そうではありません。

于 2009-12-02T13:24:29.537 に答える
2

統計は、クエリオプティマイザにとって非常に重要です。それらは、自動または手動で定期的に収集する必要があります。

クエリを実行すると、オラクルはクエリを満たすために利用可能な実行プランのプールを生成します。これらの実行プランは、まったく同じ結果が返されるという観点からは同じです。そこに到達するための道は、あるプランの方がはるかに効率的である可能性があります。この効率を判断するために、Oracleは、各実行計画で使用されるオブジェクトで生成された統計を使用して、個々のコストを判断します。これらの統計が存在しないか古くなっている場合、各プランに関連するコストの精度が低くなるため、最適なプランが選択されない可能性があります。

Oracleがこのコストを決定するために使用する主要な統計の一部を次に示します。

テーブル統計

 * Number of rows
 * Number of blocks
 * Average row length    

列統計

 * Number of distinct values (NDV) in column
 * Number of nulls in column
 * Data distribution (histogram)
 * Extended statistics

インデックス統計

* Number of leaf blocks
* Levels
* Clustering factor

システム統計

* I/O performance and utilization
* CPU performance and utilization
于 2009-12-02T13:34:46.790 に答える
2

統計は、オラクルのコストベースのオプティマイザ(CBO)によって使用され、クエリを実行するさまざまな方法の相対的なコストを計算して、最も適切なものを選択できるようにします。

全体として、これは非常にうまく機能し、継続的に改善されています。たとえば、11gでは、相関列に述語を持つクエリに大いに役立つ複数列のヒストグラムを収集できます(たとえば、生年月や星座のように強く相関している、または性別や身長のように相関が弱い)。

しかし、それは完璧ではありません。たとえば、2つのテーブル間の結合の結果セットのカーディナリティーを推定することは、フィルター操作からカーディナリティーを推定するのと同様に、かなり正確ですが、2つを組み合わせるには、簡単に不正確になる可能性のある多くの推定が必要です。場合によっては、これらの問題は、ヒントを使用するか、中間結果セットにグローバル一時テーブルを使用することで回避できます。

統計のもう1つの問題は、統計を変更すると実行プランが変更される可能性があるため、統計の継続的な収集を阻止するか、統計の変更による影響を分析してから実装するという動きが最近見られることです。

ジョナサンルイスの本を探してください-それは主題の非常に徹底的な扱いです。

于 2009-12-02T15:06:19.587 に答える