Внезапно (но, к сожалению, я не знаю, когда было «внезапно»; я знаю, что в какой-то момент в прошлом он работал нормально) один из моих запросов начал выполнять 7+ секунд вместо миллисекунд. У меня есть 1 локальная таблица и 3 таблицы доступны через ссылку на БД. 3 удаленные таблицы объединены, и одна из них соединена с моей локальной таблицей.
Само предложение локальной таблицы занимает всего несколько миллисекунд для самостоятельного выполнения и возвращает только несколько (максимум 10 или 100) записей. Эти 3 удаленные таблицы содержат много сотен тысяч, возможно, миллионов записей между ними, и если я присоединюсь к ним соответствующим образом, я получу десятки или сотни тысяч записей.
Я присоединяюсь только к удаленным таблицам, чтобы можно было извлечь несколько фрагментов данных, относящихся к каждой записи в моей локальной таблице.
Однако, похоже, происходит то, что Oracle сначала соединяет удаленные таблицы, а затем мою локальную таблицу с этим беспорядком. Это всегда будет плохой идеей, особенно если учесть, что набор данных существует прямо сейчас, поэтому я добавил подсказку /*+ LEADING(local_tab remote_tab_1) */
в свой запрос, и теперь он возвращается в миллисекундах.
Я сравнил планы объяснения, и они почти идентичны, за исключением одного BUFFER SORT
на одной из удаленных таблиц.
Мне интересно, что может заставить Оракула подойти к этому неправильно? Это проблема индекса? Что я должен искать?