Share via


結合フィルタ

結合フィルタを使用すると、パブリケーション内の関連テーブルのフィルタ選択方法に基づいてテーブルをフィルタ選択できます。通常、親テーブルにはパラメータ化されたフィルタが使用されます。そのため、テーブル間の結合を定義する場合とほぼ同じ方法で 1 つ以上の結合フィルタを定義できます。結合フィルタは、結合フィルタ句に一致した場合のみ関連テーブルのデータがレプリケートされるように、パラメータ化されたフィルタを拡張します。

結合フィルタは通常、適用対象テーブルの主キーと外部キーのリレーションシップに従います。ただし、主キーと外部キーのリレーションシップに厳密に限定されるわけではありません。結合フィルタには、2 つのテーブルの関連データを比較するためのあらゆるロジックを使用できます。

Adventure Works サンプル データベースの次のテーブルを検討してみましょう。これらのテーブルは主キーと外部キーのリレーションシップによって関連付けられています。

  • HumanResources.Employee

  • Sales.SalesOrderHeader

  • Sales.SalesOrderDetail

これらのテーブルは、移動営業部門を支援するアプリケーションで利用できます。ただし、HumanResources.Employee テーブルの各営業担当者が担当顧客の注文に関連するデータのみを受け取れるように、これらのテーブルをフィルタ選択する必要があります。

最初に、親テーブルに対してパラメータ化されたフィルタを定義します。この例では、HumanResources.Employee が親テーブルになります。このテーブルには LoginID 列が含まれており、この列には各従業員のログインが domain\login 形式で格納されています。このテーブルにフィルタを適用して各従業員が関連データのみを受け取れるようにするには、パラメータ化されたフィルタ句を次のように指定します。

LoginID = SUSER_SNAME()

このフィルタを指定すると、各従業員のサブスクリプションには、当該従業員に関連する HumanResources.Employee テーブルのデータのみ (この例では単一の行) が格納されます。詳細については、「パラメーター化された行フィルター」を参照してください。

次の手順で、このフィルタを各関連テーブルに拡張します。フィルタの拡張に使用する構文は、2 つのテーブルの結合の指定に使用する構文とほぼ同じです。最初の結合フィルタ句を次のように指定します。

Employee.EmployeeID = SalesOrderHeader.SalesPersonID

この指定により、各営業担当者に関連する注文データのみがサブスクリプションに格納されます。2 つ目の結合フィルタ句を次のように指定します。

SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID

この指定により、各営業担当者の注文データに関連する詳細データのみがサブスクリプションに格納されます。この例では、各ポイントで単一のテーブルが結合されていますが、複数のテーブルを結合することもできます。

結合フィルタはパブリケーションの新規作成ウィザードと [パブリケーションのプロパティ] ダイアログ ボックスで 1 つずつ追加したり、プログラムを使用して追加することができます。パブリケーションの新規作成ウィザードを使用して結合フィルタを自動的に生成することもできます。このウィザードでテーブルの行フィルタを指定すると、すべての関連テーブルに対して結合フィルタが適用されます。

結合フィルタのパフォーマンスの最適化

次のガイドラインに従うことにより、結合フィルタのパフォーマンスを最適化できます。

  • 結合フィルタ階層のテーブル数を制限します。

    結合フィルタを適用できるテーブル数に制限はありませんが、多数のテーブルにフィルタを適用すると、マージ処理中のパフォーマンスに大きく影響します。テーブルが 5 つ以上の結合フィルタを生成する場合は、小さなテーブル、変更されないテーブル、プライマリ参照テーブルはフィルタ選択しないという別の解決策を検討してください。結合フィルタは、サブスクリプション間でパーティション分割する必要のあるテーブル間でのみ使用します。

  • 必要に応じて join unique key オプションを True に設定します。

    親テーブルの結合列が一意の場合、特別なパフォーマンスの最適化機能をマージ処理で利用できます。一意な列に基づいて結合条件が指定されている場合、結合フィルタの join unique key オプションを設定します。このオプション設定の詳細については、前のセクションに示されている操作方法のトピックを参照してください。

  • 結合フィルタで参照される列にインデックスが作成されていることを確認します。

    結合フィルタで参照される列にインデックスを作成すると、レプリケーションのフィルタ処理がより効率的に実行されます。

  • 結合フィルタと同様の処理をする行フィルタは作成しないでください。

    WHERE 句にサブクエリを使用すると、結合フィルタと同様の処理の行フィルタを次のように作成できます。

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

    上記のようなロジックを使用する場合、サブクエリではなく結合フィルタを使用することを強くお勧めします。アプリケーションでサブクエリを使用する行フィルタが必要な場合は、サブクエリが参照するデータが変更されない読み取り専用データであることを確認してください。