0

Oracle インスタンスのバージョン: 「Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production」

  • 新しいテーブル [ord] を作成します。テーブルには何もありません。[select * from ord] を使用して統計をチェックします。コストは 2 です。
  • [ord] テーブルに 1000 レコードを挿入し、次のスクリプトを実行して統計を収集すると、コストは 9 になります。

    EXEC dbms_stats.gather_table_stats('COREBM','ORD',degree => 4,estimate_percent => null,method_opt => 'for all columns',cascade => TRUE);

  • 次に、[ord] テーブル ([delete from ord]) のデータをクリアし、変更がコミットされていることを確認し、[EXEC dbms_stats.gather_table_stats(...)] を再度実行して統計を収集します。コストはまだ 9 です。 2 として期待しているものとは異なります

[ord] テーブルのすべてのデータが削除され、統計情報が収集された後、[ord] テーブルに何もないのに、なぜ [ord] テーブルのコストがまだ 9 なのかわかりません。

4

1 に答える 1

1

クエリがテーブルのフル スキャンを実行していると仮定すると、テーブルの最高水準点までのすべてのブロックを読み取る必要があることを意味します。単純なデータを実行する場合、最高水位標はリセットされませんDELETE。Oracle は、将来さらに多くのデータを挿入する可能性が高いと想定しているため、データを削除してすぐに再取得する必要がある場合にのみエクステントを解放するコストが発生しません。その後。これは、1000 行のデータがある場合でも、その後同じ最高水準点を持つデータが 0 行ある場合と同じように、フル テーブル スキャンのコストがかかることを意味します。したがって、 を実行した後のコストは同じであると予想されますDELETE

最高水準点をリセットしたい場合TRUNCATEは、単にデータを削除するのではなく、テーブルを削除できます。これは通常行うことではありませんが、この種の概念実証に使用できます。

于 2013-09-04T04:47:37.620 に答える