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

Применимо к:SQL Server

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

Фильтрация опубликованных данных для репликации слиянием
Параметризованные фильтры строк