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, я бы:

  1. Пометить все индексы в таблице как UNUSABLE, кроме уникального индекса.
  2. ВСТАВИТЬ все записи
  3. Поймать DUPLICATE VALUE ON INDEX исключение во время ВСТАВКИ и выдачи соответствующего ОБНОВЛЕНИЯ.
  4. УДАЛИТЬ обработанные строки из входной записи.
  5. Зафиксируйте каждые N записей (1000? 10000? 100000? Ваш выбор...), вызывая DBMS_STATS.GATHER_TABLE_STATS для таблицы, в которую вы вставили после каждого COMMIT.

Удачи.

Другие вопросы по тегам