2016-02-06 7 views
0

У меня есть датамарт с 5 таблицами измерений и таблицей фактов. Я пытаюсь очистить таблицу размеров, которая имеет несколько строк (4000 строк). Но таблица фактов имеет миллионы строк (25 ГБ) (индексы и разделы).Oracle - Удалить одну строку в таблице размеров Slow

Когда я пытаюсь удалить строку в размерности таблицы, процесс становится очень медленным. Это так же медленно, несмотря на отсутствие связи с строкой в ​​таблице фактов (каскадное удаление).

Есть ли способ оптимизировать это ?. Заранее спасибо.

+0

Есть ли внешний ключ в таблице фактов, который ссылается на измерение? Если да, индексируется ли внешний ключ? Если да, то сколько строк в таблице фактов относится к размеру? –

ответ

0

Предположительно, существует каскадное удаление какого-либо рода между таблицей измерений и таблицей фактов.

Добавление индекса в столбце ключа в таблице фактов может быть достаточным. Затем Oracle может сразу определить, есть ли/где какое-либо заданное значение.

Если это не сработает, полностью отключите ограничение внешнего ключа. Удалить неиспользуемые значения и добавить ограничение назад в

+0

«Добавление индекса в ключевой столбец таблицы фактов может быть достаточным. Тогда Oracle может сразу определить, есть ли/где какое-либо заданное значение». Не вариант, потому что вставка будет очень медленной (новый индекс). «Если это не сработает, полностью удалите ограничение внешнего ключа. Удалите неиспользуемые значения и добавьте ограничение обратно». Это отличная альтернатива. Это просто медленно, когда я пытался активировать ограничение. – JohnPortella

+0

@JohnPortella. , , Наличие индекса в столбце замедляет вставки, но я бы не характеризовал разницу как «очень медленную», потому что индекс присутствует. Это опыт, который у вас был с вставками в таблицах с индексами? Какова относительная производительность iwth и без индекса hte? –

0

Вы можете попробовать эти стратегии, а также:.

создать еще одну копию таблицы фактов, но без тусклого столбца внешнего ключа таблицы, подлежащая очистка.

создать fact_table_new в выберите dim1_k, dim2_k, dim3_k, dim4_k, dim5_k (это не колонка), Fact_1, Fact_2, ... от FACT_TABLE;

или

обновление FACT_TABLE набор dim5_fk_col = нуль где dim5_fk_col в (выберите k_col из dim5_table);

+0

Создать новую таблицу не вариант, потому что новая информация вставляет каждый час, а размер большой. Обновление таблицы фактов происходит очень медленно. – JohnPortella