19.5.1.28 Репликация и поиск строк
Когда реплика, использующая формат репликации на основе строк, применяет операцию UPDATE или DELETE, она должна искать соответствующие строки в соответствующей таблице. Алгоритм, используемый для выполнения этого процесса, в первую очередь использует один из индексов таблицы для поиска, а если подходящих индексов нет, то использует хеш-таблицу.
Алгоритм сначала оценивает доступные индексы в определении таблицы, чтобы определить, есть ли подходящий индекс для использования, и если таких индексов несколько, какой индекс лучше всего подходит для операции. Алгоритм игнорирует следующие типы индексов:
Индексы полнотекстового поиска.
Скрытые индексы.
Сгенерированные индексы.
Индексы с множественными значениями.
Любой индекс, где предшествующее изображение строки события не содержит все столбцы индекса.
Если после исключения этих типов индексов подходящих индексов не найдено, алгоритм не использует индекс для поиска. Если подходящие индексы есть, один индекс выбирается из кандидатов в следующем порядке приоритетов:
Первичный ключ.
Уникальный индекс, где каждый столбец в индексе имеет атрибут NOT NULL. Если таких индексов несколько, алгоритм выбирает самый левый из них.
Любой другой индекс. Если таких индексов несколько, алгоритм выбирает самый левый из них.
Если алгоритм может выбрать первичный ключ или уникальный индекс, где каждый столбец в индексе имеет атрибут NOT
NULL, он использует этот индекс для итерации по строкам в операции UPDATE или DELETE. Для каждой строки в событии строки алгоритм ищет строку в индексе, чтобы найти запись в таблице для обновления. Если совпадающая запись не найдена, он возвращает ошибку ER_KEY_NOT_FOUND и останавливает поток применителя репликации.
Если алгоритм не смог найти подходящий индекс или смог найти только не уникальный индекс или индекс, содержащий значения NULL, для идентификации записей таблицы используется хеш-таблица. Алгоритм создаёт хеш-таблицу, содержащую строки в операции UPDATE или DELETE, с ключом в виде полного предшествующего изображения строки. Затем алгоритм итерируется по всем записям в целевой таблице, используя выбранный индекс, если он был найден, или же выполняет полный сканирование таблицы. Для каждой записи в целевой таблице он определяет, существует ли эта строка в хеш-таблице. Если строка найдена в хеш-таблице, запись в целевой таблице обновляется, а строка удаляется из хеш-таблицы. Когда все записи в целевой таблице проверены, алгоритм проверяет, пуста ли теперь хеш-таблица. Если в хеш-таблице остались несопоставленные строки, алгоритм возвращает ошибку ER_KEY_NOT_FOUND и останавливает поток применителя репликации.
© 2025 Oracle
Licensed under the GPLv2 License.