Поделиться через


Как репликация слиянием вычисляет секции в фильтрованных публикациях

Когда одна или несколько таблиц в публикации слиянием фильтруются при помощи параметризованных фильтров и фильтров соединения, данные в опубликованных таблицах делятся на секции. Секция представляет собой подмножество строк в таблице. Когда подписчик синхронизируется с издателем, издатель должен определить строки, относящиеся к секции подписчика, на основании значений, предоставленных подписчиком для системных функций SUSER_SNAME() или HOST_NAME(). Процесс определения членства секций изменений на издателе для каждого подписчика, получающего набор фильтрованных данных, называется оценкой секции.

В зависимости от данных, содержащихся в опубликованных таблицах, и от настроек, выбранных при создании параметризованного фильтра и любых связанных фильтров соединения, каждая строка опубликованной таблицы может:

  • Принадлежать одной секции и быть реплицированной только для одного подписчика (значение 3 для параметра @partition_options процедуры sp_addmergearticle). Например, в базе данных AdventureWorks можно отфильтровать таблицу Employee с помощью следующего предложения фильтра: WHERE Employee.LoginID = SUSER_SNAME(). Строка, соответствующая идентификатору входа, отсылается только одному подписчику.

  • Принадлежать одной секции и быть реплицированной нескольким подписчикам (значение 2 для параметра @partition_options). Например, в базе данных AdventureWorks можно отфильтровать таблицу Продукты с помощью следующего предложения фильтра: WHERE Products.ProductLine = HOST_NAME() Значение HOST_NAME() переопределяется таким образом, чтобы группа сотрудников отдела продаж, отвечающих за продажу горных велосипедов, получила все строки со значением «M» в столбце ProductLine. Каждая строка со значением «M» принадлежит только одной секции, но отсылается нескольким подписчикам. Дополнительные сведения об использовании HOST_NAME() см. в подразделе «Фильтрация с использованием HOST_NAME()» раздела Параметризованные фильтры строк.

  • Принадлежать нескольким секциям и быть реплицированной для нескольких подписчиков (значение 0 или 1 для параметра @partition_options). Например, в базе данных AdventureWorks можно отфильтровать таблицу Продукты с помощью следующего предложения фильтра: WHERE Products.ProductLine = HOST_NAME() or Products.ListPrice < 100. В этом случае сотрудники отдела продаж, отвечающие за продажу горных велосипедов, могут также продавать товары других категорий при условии, что отпускная цена таких товаров не превышает 100 долларов. Так как в предложении фильтра присутствует логическая функция OR, строка может принадлежать нескольким секциям.

Как вычисляются секции

При оценке секций в репликации слиянием используется один из двух способов в зависимости от того, применяется функция предварительно вычисляемых секций или нет. При условии соблюдения ряда требований новые публикации слиянием по умолчанию создаются с включенной функцией предварительно вычисляемых секций, а уже существующие публикации обновляются для использования такой функции. Полный список требований см. в разделе Оптимизация производительности параметризованного фильтра с помощью предварительно вычисляемых секций.

Оценка секций при использовании предварительно вычисляемых секций

При использовании предварительно вычисляемых секций принадлежность секции для всех изменений на издателе предварительно вычисляется и сохраняется в момент внесения таких изменений в опубликованные таблицы. В результате, когда подписчик синхронизируется с издателем, он может немедленно начать загрузку изменений, соответствующих его секции, без необходимости проходить процесс оценки секции. Такой принцип работы приводит к увеличению производительности, если публикация имеет большое количество изменений, подписчиков или статей.

В процессе вычисления предварительно вычисляемых секций участвуют следующие системные таблицы:

  • MSmerge_partition_groups

  • MSmerge_current_partition_mappings

  • MSmerge_past_partition_mappings

Таблица MSmerge_partition_groups содержит по одной строке для каждой секции, которая определена в публикации. Секции могут быть:

  • Определены явно с использованием процедуры sp_addmergepartition или страницы Секции данных диалогового окна «Свойства публикации».

  • Созданы автоматически, если подписчик синхронизируется и запрашивает секцию, которая еще не задана в MSmerge_partition_groups.

Другие две таблицы (MSmerge_current_partition_mappings и MSmerge_past_partition_mappings) заполняются по мере внесения изменений в опубликованные таблицы. Каждый раз при внесении изменения в опубликованную таблицу в базе данных публикации запускается триггер слияния, который записывает метаданные:

  • Таблица MSmerge_current_partition_mappings содержит по одной строке для каждого уникального сочетания строк в MSmerge_contents и MSmerge_partition_groups. Например, если строка в пользовательской таблице принадлежит двум секциям, и эта строка обновляется, то одна строка вставляется в таблицу MSmerge_contents для сообщения об обновлении, и две строки вставляются в таблицу MSmerge_current_partition_mappings для указания на то, что обновление строк затронуло две секции.

  • Таблица MSmerge_past_partition_mappings содержит по одной строке для каждой строки, которая больше не принадлежит данной секции. Строка перемещается за пределы секции, если:

    • Строка удалена. Если строка удалена из пользовательской таблицы, она вставляется в таблицу MSmerge_tombstone, и одна или более строк вставляются в таблицу MSmerge_past_partition_mappings.

    • Значение в столбце, используемом для фильтра, изменено. Например, если параметризованный фильтр основан на штате, в котором расположена штаб-квартира компании, и компания переезжает, строка, соответствующая компании (и связанные строки в других таблицах), может быть перемещена из секции одного менеджера по продажам в секцию другого менеджера по продажам. Если строка обновлена и в результате не принадлежит больше этой секции, строка вставляется или обновляется в таблице MSmerge_contents, и одна или несколько строк вставляются в таблицу MSmerge_past_partition_mappings.

    ПримечаниеПримечание

    При использовании неперекрывающихся секций с одной подпиской на секцию (значение 3 для параметра @partition_options процедуры sp_addmergearticle) системные таблицы MSmerge_current_partition_mappings и MSmerge_past_partition_mappings не используются для отслеживания сопоставлений секций строк, потому что каждая строка принадлежит только одной секции и может быть изменена только на одном подписчике.

Оценка секций при использовании процесса SetupBelongs

Процесс без использования предварительно вычисляемых секций называется SetupBelongs. Во время синхронизации оценка секций выполняется для каждого изменения, вносимого в отфильтрованную таблицу на издателе, начиная с последнего запуска агента слияния для конкретного подписчика. Процесс выполняется повторно для каждого подписчика, синхронизирующегося с издателем.

Чтобы выполнить оценку секций для подписчика, агент слияния вызывает системную хранимую процедуру sp_MSsetupbelongs, которая:

  1. Создает две временные таблицы для каждой фильтрованной статьи: #belongs_<RandomNumber> и #notbelongs_<RandomNumber>.

  2. Использует значение, возвращаемое функциями SUSER_SNAME() или HOST_NAME() на подписчике для запроса системного представления. Запрос используется для определения значимости строки в таблице MSmerge_contents или MSmerge_tombstone для секции подписчика.

  3. Если строка не важна для подписчика (как, например, операция вставки для другой секции), метаданные для этой строки не сохраняются в #belongs или #notbelongs. Если строка важна, то выполняется одно из двух возможных действий:

    • Строка добавляется в #belongs, если: строка в MSmerge_contents является вставкой, принадлежащей секции, или строка в MSmerge_contents является обновлением, которое не изменяет значений ни в одном столбце, используемом для фильтрации.

    • Строка добавляется в #notbelongs, если: строка в MSmerge_contents представляет собой обновление, которое изменяет значение в любом столбце, используемом для фильтрации (другими словами, выполняет перемещение строки в другую секцию), или строка в MSmerge_tombstone представляет собой удаление строки в секции.

ПримечаниеПримечание

Даже при использовании предварительно вычисляемых секций процесс SetupBelongs выполняется при первой синхронизации подписки, если подписка создается после того, как другие подписки начали принимать изменения.