У меня есть эта таблица:
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 индекс не понравился больше.
На следующее утро Oracle внезапно полюбил индекс (вероятно, спал над ним) и начал использовать его, но ненадолго. Через некоторое время обработка упала с 50 строк / с до 3 строк / с, и я снова увидел «FULL TABLE SCAN». Что происходит?
В моем случае мне нужно обработать около миллиона строк. Я совершаю изменения в партиях ок. 50. Есть ли какая-нибудь команда, которую я должен выполнить после коммита для обновления / реорганизации индекса или что-то в этом роде?
Я на Oracle 10g.
[РЕДАКТИРОВАТЬ] У меня 969'491 различных ключей в этой таблице, 3 типа и 3 состояния.