私はこのテーブルを持っています:
create table demo (
key number(10) not null,
type varchar2(3) not null,
state varchar2(16) not null,
... lots more columns ...
)
そしてこのインデックス:
create index demo_x04 on demo(key, type, state);
このクエリを実行すると
select * from demo where key = 1 and type = '003' and state = 'NEW'
EXPLAIN PLAN
は、完全なテーブル スキャンを実行することを示しています。そのため、インデックスを削除して再度作成しました。EXPLAIN PLAN
まだフルテーブルスキャンと言っています。それはどうしてですか?
背景: これは履歴データであるため、状態を含む行を検索し、状態CLEARED
を含む新しい行を挿入しますNEW
(さらに、古い行からいくつかの値をコピーします)。その後、古い行が に更新されUSED
ます。したがって、テーブルは常に大きくなります。私が気付いたのは、インデックスのカーディナリティが 0 であることです (何千もの異なる値があるにもかかわらず)。再作成後、カーディナリティは増加しましたが、CBO はインデックスを気に入りませんでした。
翌朝、オラクルは突然インデックスを気に入り (おそらくそれで寝ていたのでしょう)、それを使い始めましたが、長くは続きませんでした。しばらくすると、処理速度が 50 行/秒から 3 行/秒に低下し、再び「FULL TABLE SCAN」が表示されました。何が起こっている?
私の場合、約 100 万行を処理する必要があります。私は約バッチで変更をコミットします。50. インデックスを更新/再編成するためにコミット後に実行する必要があるコマンドなどはありますか?
私はOracle 10gを使用しています。
[編集] このテーブルには 969,491 個の異なるキーがあり、3 つのタイプと 3 つの状態があります。