Фильтры соединения
Фильтр соединения позволяет фильтровать таблицу на основе фильтра связанной таблицы в публикации. Родительская таблица, как правило, фильтруется параметризованным фильтром. Затем определяется один или несколько фильтров соединения практически таким же способом, что и соединение таблиц. Фильтры соединения расширяют параметризованные фильтры таким образом, чтобы данные в связанных таблицах реплицировались только в том случае, если они соответствуют предложению фильтра соединения.
Фильтры соединения, как правило, следуют связям первичный ключ/внешний ключ, определенным для таблиц, в которых они применяются, но не ограничиваются этими связями. Фильтр соединения может быть основан на любой логике, которая сравнивает связанные данные в двух таблицах.
Обратите внимание на следующие таблицы в образце базы данных Adventure Works, связанные отношениями первичный ключ/внешний ключ:
HumanResources.Employee
Sales.SalesOrderHeader
Sales.SalesOrderDetail
Эти таблицы могли бы использоваться в приложении для поддержки перемещающихся между регионами продавцов, но они должны фильтроваться таким образом, чтобы каждый менеджер продаж из таблицы HumanResources.Employee получал лишь те данные, которые относятся к заказам его клиентов.
Прежде всего необходимо определить параметризованный фильтр в родительской таблице, в данном примере — таблице HumanResources.Employee.. Эта таблица включает столбец LoginID, содержащий имя входа каждого сотрудника в виде domain\login. Для фильтрации таблицы, при которой каждый работник будет видеть только данные, связанные с ним, укажите следующее предложение параметризованного фильтра:
LoginID = SUSER_SNAME()
Благодаря этому фильтру подписка каждого сотрудника будет содержать только те данные из таблицы HumanResources.Employee, которые относятся к этому сотруднику (в этом случае — в одной строке). Дополнительные сведения см. в разделе Параметризованные фильтры строк.
Следующим этапом является расширение этого фильтра на все связанные таблицы, используя синтаксис, подобный тому, который использовался для указания соединения таблиц. Первое предложение фильтра соединения:
Employee.EmployeeID = SalesOrderHeader.SalesPersonID
Это предложение обеспечивает включение в подписку только тех сведений о заказах, которые относятся к каждому менеджеру по продажам. Второе предложение фильтра соединения:
SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
Это предложение обеспечивает включение в подписку только подробных данных о заказах, которые относятся к каждому менеджеру по продажам. В данном примере показывается соединение отдельной таблицы в каждой точке; кроме того, в каждой точке можно соединить и несколько таблиц.
Фильтры соединения можно добавлять по одному в мастере создания публикаций и диалоговом окне Свойства публикации, или же их можно добавить программно. Кроме того, их можно автоматически формировать с помощью мастера создания публикаций: укажите фильтр строк для таблицы, и фильтры соединения применяются ко всем связанным таблицам.
Среда Среда SQL Server Management Studio: Как определить и изменить фильтр соединения между статьями публикации слиянием (среда SQL Server Management Studio) и Как автоматически сформировать набор фильтров соединения между статьями публикаций слиянием (среда SQL Server Management Studio)
Программирование репликации на Transact-SQL: Как определить и изменить фильтр соединения между статьями публикации слиянием (программирование репликации на языке Transact-SQL)
Программирование объектов RMO: Как определить статью (программирование объектов RMO)
Оптимизация производительности фильтра соединения
Чтобы оптимизировать производительность фильтра соединения, необходимо придерживаться следующих рекомендаций.
Ограничьте число таблиц, входящих в иерархию фильтра соединения.
Фильтры соединений могут включать неограниченное количество таблиц, однако фильтры с большим количеством таблиц могут в значительной степени повлиять на производительность во время процесса слияния. Если создаются фильтры соединения для пяти и более таблиц, рассмотрите другие решения: не фильтруйте маленькие таблицы, таблицы, которые не предназначены для изменений или являются поисковыми таблицами. Используйте фильтры соединения только между теми таблицами, которые должны быть секционированы среди подписок.
Для параметра join unique key установите значение True (где необходимо).
Для процесса слияния предлагается специальная оптимизация производительности, если соединяемый столбец в родительской таблице уникален. Если условие соединения основано на уникальном столбце, задайте для фильтра соединения параметр join unique key. Сведения о настройке этого параметра см. в разделах руководства, перечисленных в предыдущем разделе.
Убедитесь, что столбцы, указанные в фильтрах соединений, имеют индексы.
Если столбцы, указанные в фильтре, имеют индексы, репликация может более эффективно обработать фильтры.
Не создавайте фильтры строк, которые имитируют фильтры соединения.
Можно создавать фильтры строк, имитирующие фильтры соединения, используя вложенный запрос в предложении WHERE, например:
WHERE Customer.SalesPersonID IN (SELECT EmployeeID FROM Employee WHERE LoginID = SUSER_SNAME())
Настоятельно рекомендуется такую логику выражать в фильтре соединения, а не во вложенном запросе. Если приложение требует, чтобы фильтр строк использовал вложенный запрос, убедитесь, что вложенный запрос обращается только к поисковым данным, которые не изменяются.
См. также