MERGE INTO Производительность по мере роста таблицы
Это общий вопрос об Oracle MERGE INTO
оператор с конкретным сценарием, на СУБД Oracle 12c.
Ежедневные данные будут загружены в StagingTableA
- около 10 м рядов. Это будет MERGEd INTO TableA
,TableA
будет варьироваться от 0 до 10 м строк (соответствие StagingTableA
). Там могут быть времена, когда TableA
будет сокращен / опустошен и оставлен с 0 рядами.
Понятно, когда TableA
пустой, прямой INSERT
будет делать работу, но процедура была написана для использования MERGE INTO
метод для обработки всех сценариев.
MERGE .. MATCH
находится в индексированном столбце.
Мой вопрос - неуверенность в том, как MERGE
обрабатывает MATCH
в обстоятельствах, когда TableA
начнется пустой, а затем сильно вырастет во время MERGE
выполнение. MATCH
в индексированных столбцах будет использоваться FTS, так как статистика покажет, что таблица содержит 0 строк.
В какой-то момент во время MERGE
сделка, это станет неэффективным.
Это MERGE
заявление достаточно умное, чтобы обнаружить это и изменить план выполнения, и начать использовать индекс вместо FTS?
Если это было сделано по-старому с CURSOR
, UPDATE
а также INSERT
тогда мы могли бы потенциально ввести ANALYZE
в соответствующей точке (скажем, после 50000 обработанных) на TableA
перейти на оптимальный план.
Я не смог найти никакой документации, касающейся этого конкретного вопроса.
1 ответ
Надеюсь, у вас есть уникальный индекс для этой таблицы, который основан на входящих данных. Если бы я был тобой, вместо того, чтобы использовать простое MERGE, я бы:
- Пометить все индексы в таблице как UNUSABLE, кроме уникального индекса.
- ВСТАВИТЬ все записи
- Поймать
DUPLICATE VALUE ON INDEX
исключение во время ВСТАВКИ и выдачи соответствующего ОБНОВЛЕНИЯ. - УДАЛИТЬ обработанные строки из входной записи.
- Зафиксируйте каждые N записей (1000? 10000? 100000? Ваш выбор...), вызывая
DBMS_STATS.GATHER_TABLE_STATS
для таблицы, в которую вы вставили после каждого COMMIT.
Удачи.