Обновление запроса, требующего много времени в оракуле 10g

У меня есть таблица, которая содержит более 2 миллионов записей, я пытаюсь обновить таблицу, используя следующий запрос

UPDATE toc T
SET RANK =
 65535
 - (SELECT COUNT (*)
 FROM toc T2
 WHERE S_KEY LIKE '00010001%'
 AND A_ID IS NOT NULL
 AND T2.TARGET = T.TARGET
 AND T2.RANK > T.RANK)
WHERE S_KEY LIKE '00010001%' AND A_ID IS NOT NULL

Обычно этот запрос занимал 5 минут, чтобы обновить 50000 строк в нашем промежуточном db, который является точной копией производственной базы данных, но в нашем производстве db требуется 6 часов для выполнения...

Я попробовал Oracle advisory выбрать правильный план выполнения, но ничего не работает...

План

UPDATE STATEMENT ALL_ROWSCost: 329,471 
 6 UPDATE TT.TOC 
 2 TABLE ACCESS BY INDEX ROWID TABLE TT.TOC Cost: 5 Bytes: 4,173,236 Cardinality: 54,911 
 1 INDEX SKIP SCAN INDEX TT.DATASTAT_SORTKEY_IDX Cost: 4 Cardinality: 1 
 5 SORT AGGREGATE Bytes: 76 Cardinality: 1 
 4 TABLE ACCESS BY INDEX ROWID TABLE TT.TOC Cost: 5 Bytes: 76 Cardinality: 1 
 3 INDEX SKIP SCAN INDEX TT.DATASTAT_SORTKEY_IDX Cost: 4 Cardinality: 1

Я вижу следующие события ожидания

1,066 db file sequential read 10,267 0 3,993 0 6 39,933,580

 1,066 db file scattered read 413 0 188 0 6 1,876,464

Любая помощь будет оценена.

вот текущий список индексов

DSTAT_SKEY_IDX D_STATUS 1
 DSTAT_SKEY_IDX S_KEY 2
 IDX$$_165A0002 N_LABEL 1
 S_KEY_IDX S_KEY 1
 XAK1_TOC N_RELATIONSHIP 1
 XAK2_TOC TARGET 1
 XAK2_TOC N_LABEL 2
 XAK2_TOC D_STATUS 3
 XAK2_TOC A_ID 4
 XIE1_TOC N_RELBASE 1
 XIF4_TOC SOURCE_FILE_ID 1
 XIF5_TOC A_ID 1
 XPK_TOC N_ID 1

Atif

1 ответ

Вы пропустите сканирование, где вы, возможно, хотите провести сканирование диапазона.

Сканирование диапазона возможно только в том случае, когда столбцы индекса упорядочены по убыванию избирательности - в вашем случае кажется, что это должно быть S_KEY - TARGET - RANK

Обновление: переписывание запроса в другом порядке не имеет никакого значения. Важна последовательность столбцов в индексах этой таблицы.

сначала покажем нам текущие столбцы индекса для этой таблицы:

select index_name, column_name, column_position from all_ind_columns where table_name = 'TOC'

то вы можете создать новый индекс, например

create index toc_i_s_key_target_rank on toc (s_key, target, rank) compress;

licensed under cc by-sa 3.0 with attribution.