2014-01-06 6 views
1

У меня есть график RDF в Oracle, который имеет ок. 7, 000, 000 троек (строк)Лучше «удалять строки из таблицы» производительность

У меня есть простой оператор выбора, который получает старые дубликаты (тройки) и удаляет их из этого графика RDF.

Теперь скажем мой ВЫБОР возвращает 300 результатов, это становится вычислительно очень дорого, так как DELETE делает полное сканирование таблицы TEST_tpl 300 раз и, как я сказал TEST_tpl имеет ок.

7, 000, 000 строк ...

DELETE FROM TEST_tpl t WHERE t.triple.get_subject() 
IN 
(
    SELECT rdf$stc_sub from rdf_stage_table_TEST 
    WHERE rdf$stc_pred LIKE '%DateTime%' 
) 

Я пытаюсь найти способ создать процедуру оракула, что бы пройти через таблицу только один раз для нескольких значений ...

Или может быть кто-то знает лучший способ ...

+0

Каково определение 'test_tpl'? Является ли 'тройной' тип объекта? Можете ли вы опубликовать план запроса? Вы уверены, что таблица test_tpl полностью сканируется 300 раз? Это возможно, но это будет очень странный план выбора оптимизатора, если у вас нет какой-то ужасной статистики. –

+0

Почему бы вам просто не использовать тройной магазин? – Michael

ответ

1

Я так решил, это я создал индекс по triple.get_subject()

CREATE INDEX "SEMANTIC"."TEST_tpl_SUB_IDX" 
ON 
"SEMANTIC"."TEST_tpl" ("MDSYS"."SDO_RDF_TRIPLE_S"."GET_SUBJECT"("TRIPLE")) 

Это улучшило производительность.

Спасибо @ Justin Cave и @ Michael за вашу помощь.

Смежные вопросы