1

テーブル(m_CURRENT)のdba_tab_col_statisticsを見ると、列TNEのnum_buckets値が1つのデータベースで75、別のデータベースで254であることに気付きました。DBはOracle10gです。

これが2つのテーブルの主な違いのようです。両方のデータベースをnum_bucket値と一致させる方法はありますか?

あるデータベースでは高速で、別のデータベースでは非常に遅い削除ステートメントがあります。2つのデータベースでクエリプランが異なる理由はいくつかあると思います。多くの分析の結果、遅いクエリデータベースに同じnum_bucket設定を設定することで、削除ステートメントがインデックスTNE_idxに対してfast_full_scan(この場合は遅い)ではなくrange_scan(速い)を実行できるようになると思います。

4

2 に答える 2

1

両方のデータベースでどのように統計を収集しますか?通常の統計収集スクリプトはありますか?1回限りでできるように、これを実行して、その1つの列だけでヒストグラムを収集します。

begin
dbms_stats.gather_table_stats(user,'M_CURRENT', 
          method_opt=>'for columns TNE size 254', cascade=>false, 
           granularity=>'ALL', degree=>8);
end;
/

サイズパラメータはバケットを設定します(個別の値の数がその数より少ない場合、結果は少なくなります)。

上記はestimate_pctを指定していないため、100%ではなく少数の値の母集団をサンプリングします。100%が必要な場合は、estimate_pctパラメーター*)でこれを指定しますが、通常のスクリプトがある場合は、後で上書きされる可能性があります。

* dba_tab_col_statisticsのsample_sizeをdba_tablesのnum_rowsと比較することにより、現在のサンプルサイズを確認できます。

于 2012-12-20T14:54:34.677 に答える
1

フォローアップしたいのですが、DazzaLの答えは非常に有益でしたが、私は間違っていました。バケツは違いを生みませんでした。実行することで多くの時間を節約できたはずです
explain plan for delete blah blah blah

それから

select * from table(dbms_xplan.display) 正しいステップIDに焦点を合わせます。

2つのデータベースプランが異なるステップ2で開始する必要があったときに、インデックス高速全表スキャンが使用されていたステップID5に焦点を合わせました。高速データベースがネストされたループの反結合を実行し、低速のデータベースがマージ結合の反結合を実行しているのを見ました。サブクエリにパラメータを指定せずに(文書化されていない?)ヒントを追加する NL_AJ と、目的の高速index_range_scanが使用されました。

これを書いていると、バケット番号の一致が重要かどうか疑問に思いますが、再テストする時間がありません。壊れてないので触りません!

于 2012-12-21T15:22:35.830 に答える