filtri di joinJoin Filters

Un filtro di join consente di filtrare una tabella in base al tipo di filtro applicato a una tabella correlata nella pubblicazioneA join filter allows a table to be filtered based on how a related table in the publication is filtered. Viene in genere filtrata una tabella padre mediante un filtro con parametri, quindi vengono definiti uno o più filtri di join così come si definisce un join tra tabelle.Typically a parent table is filtered using a parameterized filter; then one or more join filters are defined in much the same way that you define a join between tables. I filtri di join estendono il filtro con parametri affinché i dati nelle tabelle correlate vengano replicati solo se corrispondenti alla clausola di filtro di join.The join filters extend the parameterized filter so that the data in the related tables is only replicated if it matches the join filter clause.

I filtri join seguono in genere le relazioni tra chiavi primarie e chiavi esterne definite per le tabelle alle quali vengono applicati, ma non sono necessariamente limitati a tali relazioni.Join filters typically follow the primary key/foreign key relationships defined for the tables to which they are applied, but they are not limited strictly to primary key/foreign key relationships. Il filtro di join può essere basato su qualsiasi logica di confronto tra i dati correlati di due tabelle.The join filter can be based on any logic that compares related data in two tables.

Si considerino le tabelle seguenti del database di esempio Adventure WorksAdventure Works , correlate tramite relazioni di chiave primaria/chiave esterna:Consider the following tables in the Adventure WorksAdventure Works sample database, which are related through primary key to foreign key relationships:

  • HumanResources.EmployeeHumanResources.Employee

  • Sales.SalesOrderHeaderSales.SalesOrderHeader

  • Sales.SalesOrderDetailSales.SalesOrderDetail

    Queste tabelle potrebbero essere utilizzate in un'applicazione per supportare una forza vendita mobile, ma devono essere filtrate affinché ogni venditore della tabella HumanResources.Employee riceva soltanto i dati rilevanti per gli ordini dei propri clienti.These tables could be used in an application to support a mobile sales force, but they must be filtered so that each sales person in the HumanResources.Employee table receives only the data relevant to their customers' orders.

    Il primo passaggio consiste nel definire un filtro con parametri per la tabella padre, costituita in questo caso dalla tabella HumanResources.Employee .The first step is to define a parameterized filter on the parent table, which in this example is the HumanResources.Employee table. In questa tabella è inclusa la colonna LoginID, contenente l'account di accesso per ogni dipendente nel formato dominio\account accesso.This table includes the column LoginID, which contains the login for each employee in the form domain\login. Per filtrare questa tabella affinché ogni dipendente riceva soltanto i dati pertinenti, specificare la clausola di filtro con parametri:To filter this table so that each employee receives only the data related to them, specify a parameterized filter clause of:

LoginID = SUSER_SNAME()  

Questo filtro garantisce che la sottoscrizione di ogni dipendente contenga soltanto i dati della tabella HumanResources.Employee rilevanti per tale dipendente. In questo caso, si tratta di una singola riga.This filter ensures that each employee's subscription only contains data from the HumanResources.Employee table that is relevant to that employee (which in this case is a single row). Per altre informazioni, vedere Parameterized Row Filters.For more information, see Parameterized Row Filters.

Il passaggio successivo consiste nell'estendere questo filtro a ogni tabella correlata, utilizzando una sintassi simile a quella utilizzata per specificare un join tra due tabelle.The next step is to extend this filter to each of the related tables, using syntax similar to that used to specify a join between two tables. La prima clausola di filtro di join è:The first join filter clause is:

Employee.EmployeeID = SalesOrderHeader.SalesPersonID  

Ciò garantisce che la sottoscrizione conterrà soltanto i dati degli ordini rilevanti per ogni venditore.This ensures the subscription contains only the order data relevant to each sales person. La seconda clausola di filtro di join è:The second join filter clause is:

SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID  

Ciò garantisce che la sottoscrizione conterrà soltanto i dati di dettaglio correlati ai dati degli ordini per ogni venditore.This ensures the subscription contains only the detail data related to the order data for each sales person. In questo esempio viene illustrato il join di una singola tabella in ogni fase. È inoltre possibile unire in join più tabelle in ogni fase.This example shows a single table being joined at each point; it is also possible to join more than one table at each point.

I filtri di join possono essere aggiunti uno per volta tramite la Creazione guidata nuova pubblicazione e la finestra di dialogo Proprietà pubblicazione oppure a livello di programmazione.Join filters can be added one at a time through the New Publication Wizard and the Publication Properties dialog box, or they can be added programmatically. Possono inoltre essere generati automaticamente tramite la Creazione guidata nuova pubblicazione: specificando un filtro di riga per una tabella verranno applicati filtri di join a tutte le tabelle correlate.They can also be generated automatically through the New Publication Wizard: you specify a row filter for a table and join filters are applied to all related tables. Per altre informazioni, vedere Definire e modificare un filtro di join tra articoli di merge, Generare automaticamente un set di filtri di join tra gli articoli di merge (SQL Server Management Studio) e Definire un articolo.For more information, see Define and Modify a Join Filter Between Merge Articles, Automatically Generate a Set of Join Filters Between Merge Articles (SQL Server Management Studio), and Define an Article.

Ottimizzazione delle prestazioni dei filtri di joinOptimizing Join Filter Performance

È possibile ottimizzare le prestazioni dei filtri di join attenendosi alle linee guida seguenti:Join filter performance can be optimized by following these guidelines:

  • Limitare il numero massimo di tabelle nella gerarchia dei filtri di join.Limit the number of tables in the join filter hierarchy.

    I filtri di join possono includere un numero illimitato di tabelle, ma filtri con un numero elevato di tabelle possono influire significativamente sulle prestazioni durante l'elaborazione di processi di merge.Join Filters can involve an unlimited number of tables, but filters with a large number of tables can significantly impact performance during merge processing. Se si generano filtri di join di cinque o più tabelle, considerare altre soluzioni: non filtrare tabelle piccole, non soggette a modifica o tabelle che fungono principalmente da tabelle di ricerca.If you are generating join filters of five or more tables, consider other solutions: do not filter tables that are small, not subject to change, or are primarily lookup tables. Utilizzare i filtri di join solo tra tabelle che devono essere partizionate tra diverse sottoscrizioni.Use join filters only between tables that must be partitioned among subscriptions.

  • Se appropriato, impostare la proprietà JoinUniqueKey su True .Set the join unique key option to True where appropriate.

    Se la colonna unita in join nella tabella padre è univoca, per il processo di merge sono disponibili speciali procedure di ottimizzazione delle prestazioni.The merge process has special performance optimizations available if the joined column in the parent is unique. Se la condizione di join è basata su una colonna univoca, impostare la proprietà JoinUniqueKey per il filtro di join.If the join condition is based on a unique column, set the join unique key option for the join filter. Per informazioni sull'impostazione di questa proprietà, vedere le procedure elencate nella sezione precedente.For information about setting this option, see the how-to topics listed in the previous section.

  • Verificare che le colonne a cui viene fatto riferimento nei filtri di join siano indicizzate.Ensure that the columns referenced in join filters are indexed.

    Se le colonne a cui viene fatto riferimento nel filtro sono indicizzate, i filtri possono essere elaborati dalla replica in modo più efficiente.If the columns referenced in the filter are indexed, replication can process the filters more efficiently.

  • Non creare filtri di riga che svolgono la funzione di filtri di join.Do not create row filters that mimic join filters.

    È possibile creare filtri di riga che svolgono la funzione di filtri di join utilizzando una sottoquery in una clausola WHERE, ad esempio:It is possible to create row filters that mimic join filters by using a subquery in a WHERE clause, such as:

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

    È consigliabile esprimere tale logica in un filtro di join, anziché in una sottoquery.It is strongly recommended that all such logic be expressed in a join filter rather than a subquery. Se l'applicazione richiede l'utilizzo di una sottoquery in un filtro di riga, verificare che la sottoquery faccia riferimento soltanto a dati di ricerca non soggetti a modifiche.If your application requires a row filter to use a subsquery, ensure that the subquery only references lookup data that does not change.

Vedere ancheSee Also

Filtrare i dati pubblicati per la replica di tipo merge Filter Published Data for Merge Replication
Filtri di riga con parametriParameterized Row Filters