Filtri join
Un filtro join consente di filtrare una tabella in base al modo in cui viene filtrata una tabella correlata nella pubblicazione. Viene in genere filtrata una tabella padre mediante un filtro con parametri, quindi vengono definiti uno o più filtri join così come si definisce un join tra tabelle. I filtri join estendono il filtro con parametri affinché i dati nelle tabelle correlate vengano replicati solo se corrispondenti alla clausola di filtro join.
I filtri join seguono in genere le relazioni di chiave primaria/chiave esterna definite per le tabelle a cui vengono applicati, ma non sono strettamente limitati a tali relazioni. Il filtro join può essere basato su qualsiasi logica di confronto tra i dati correlati di due tabelle.
Si considerino le tabelle seguenti del database di esempio Adventure Works, correlate tramite relazioni di chiave primaria/chiave esterna:
HumanResources.Employee
Sales.SalesOrderHeader
Sales.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.
Il primo passaggio consiste nel definire un filtro con parametri per la tabella padre, costituita in questo caso dalla tabella HumanResources.Employee. In questa tabella è inclusa la colonna LoginID, contenente l'account di accesso per ogni dipendente nel formato dominio\account accesso. Per filtrare questa tabella affinché ogni dipendente riceva soltanto i dati pertinenti, specificare la clausola di filtro con parametri:
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. Per ulteriori informazioni, vedere Filtri di riga con parametri.
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. La prima clausola di filtro join è:
Employee.EmployeeID = SalesOrderHeader.SalesPersonID
Ciò garantisce che la sottoscrizione conterrà soltanto i dati degli ordini rilevanti per ogni venditore. La seconda clausola di filtro join è:
SalesOrderHeader.SalesOrderID = SalesOrderDetail.SalesOrderID
Ciò garantisce che la sottoscrizione conterrà soltanto i dati di dettaglio correlati ai dati degli ordini per ogni venditore. In questo esempio viene illustrato il join di una singola tabella in ogni fase. È inoltre possibile unire in join più tabelle in ogni fase.
I filtri 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. Possono inoltre essere generati automaticamente tramite la Creazione guidata nuova pubblicazione: specificando un filtro di riga per una tabella verranno applicati filtri join a tutte le tabelle correlate.
SQL Server Management Studio: Procedura: Definizione e modifica di un filtro join tra articoli di merge (SQL Server Management Studio) e Procedura: Generazione automatica di un insieme di filtri join tra gli articoli di merge (SQL Server Management Studio)
Programmazione Transact-SQL per la replica: Procedura: Definizione e modifica di un filtro join tra articoli di merge (programmazione Transact-SQL della replica)
Programmazione Replication Management Objects (RMO): Procedura: Definizione di un articolo (programmazione RMO)
Ottimizzazione delle prestazioni dei filtri join
È possibile ottimizzare le prestazioni dei filtri join attenendosi alle linee guida seguenti:
Limitare il numero di tabelle nella gerarchia dei filtri join.
I filtri 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. Se si generano filtri join di cinque o più tabelle, considerare altre soluzioni. Non filtrare tabelle di piccole dimensioni, non soggette a modifiche o principalmente utilizzate come tabelle di ricerca. Utilizzare filtri join solo tra tabelle che devono essere partizionate tra le sottoscrizioni.
Se appropriato, impostare la proprietà JoinUniqueKey su True.
Se la colonna unita in join nella tabella padre è univoca, per il processo di merge sono disponibili speciali procedure di ottimizzazione delle prestazioni. Se la condizione di join è basata su una colonna univoca, impostare la proprietà JoinUniqueKey per il filtro join. Per informazioni sull'impostazione di questa proprietà, vedere le procedure elencate nella sezione precedente.
Verificare che le colonne a cui viene fatto riferimento nei filtri join siano indicizzate.
Se le colonne a cui viene fatto riferimento nel filtro sono indicizzate, i filtri possono essere elaborati dalla replica in modo più efficiente.
Non creare filtri di riga che svolgono la funzione di filtri join.
È possibile creare filtri di riga che svolgono la funzione di filtri join utilizzando una subquery in una clausola WHERE, ad esempio:
WHERE Customer.SalesPersonID IN (SELECT EmployeeID FROM Employee WHERE LoginID = SUSER_SNAME())
È consigliabile esprimere tale logica in un filtro join, anziché in una subquery. Se l'applicazione richiede l'utilizzo di una subquery in un filtro di riga, verificare che la subquery faccia riferimento soltanto a dati di ricerca non soggetti a modifiche.
Vedere anche