Фильтры соединения

Фильтр соединения позволяет фильтровать таблицу на основе фильтра связанной таблицы в публикации. Родительская таблица, как правило, фильтруется параметризованным фильтром. Затем определяется один или несколько фильтров соединения практически таким же способом, что и соединение таблиц. Фильтры соединения расширяют параметризованные фильтры таким образом, чтобы данные в связанных таблицах реплицировались только в том случае, если они соответствуют предложению фильтра соединения.

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

Обратите внимание на следующие таблицы в образце базы данных 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

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

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

Оптимизация производительности фильтра соединения

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

  • Ограничьте число таблиц, входящих в иерархию фильтра соединения.

    Фильтры соединений могут включать неограниченное количество таблиц, однако фильтры с большим количеством таблиц могут в значительной степени повлиять на производительность во время процесса слияния. Если создаются фильтры соединения для пяти и более таблиц, рассмотрите другие решения: не фильтруйте маленькие таблицы, таблицы, которые не предназначены для изменений или являются поисковыми таблицами. Используйте фильтры соединения только между теми таблицами, которые должны быть секционированы среди подписок.

  • Для параметра join unique key установите значение True (где необходимо).

    Для процесса слияния предлагается специальная оптимизация производительности, если соединяемый столбец в родительской таблице уникален. Если условие соединения основано на уникальном столбце, задайте для фильтра соединения параметр join unique key. Сведения о настройке этого параметра см. в разделах руководства, перечисленных в предыдущем разделе.

  • Убедитесь, что столбцы, указанные в фильтрах соединений, имеют индексы.

    Если столбцы, указанные в фильтре, имеют индексы, репликация может более эффективно обработать фильтры.

  • Не создавайте фильтры строк, которые имитируют фильтры соединения.

    Можно создавать фильтры строк, имитирующие фильтры соединения, используя вложенный запрос в предложении WHERE, например:

    WHERE Customer.SalesPersonID IN (SELECT EmployeeID FROM Employee WHERE LoginID = SUSER_SNAME()) 
    

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