Filtri di unione

Si applica a:SQL Server

Un filtro di join consente di filtrare una tabella in base al tipo di filtro applicato a una tabella correlata nella pubblicazione 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. 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.

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. Il filtro di 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:

  • RisorseUmane.Dipendente

  • Sales.SalesOrderHeader

  • Sales.SalesOrderDetail (Dettagli dell'Ordine di Vendita)

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 altre informazioni sui filtri di riga con parametri, 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 di 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 di 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 di join possono essere aggiunti uno per volta tramite il New Publication Wizard e la finestra di dialogo Proprietà pubblicazione oppure tramite codice. Possono anche essere generati automaticamente tramite la procedura guidata Nuova pubblicazione: specificando un filtro di riga per una tabella, i filtri di join vengono applicati a tutte le tabelle correlate. 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.

Ottimizzazione delle prestazioni del filtro di giunzione

È possibile ottimizzare le prestazioni dei filtri di join attenendosi alle linee guida seguenti:

  • Limitare il numero massimo di tabelle nella gerarchia dei filtri di join.

    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. 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. Utilizzare i filtri di join solo tra tabelle che devono essere partizionate tra diverse sottoscrizioni.

  • Se appropriato, impostare l'opzione chiave univoca di join su True.

    Se la colonna unita nella tabella padre è univoca, per il processo di merge sono disponibili speciali ottimizzazioni delle prestazioni. Se la condizione di join è basata su una colonna univoca, impostare la proprietà JoinUniqueKey per il filtro di join. Per informazioni sull'impostazione di questa opzione, vedere gli argomenti della sezione precedente.

  • Verificare che le colonne a cui viene fatto riferimento nei filtri di 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 imitano i filtri di join.

    È possibile creare filtri di riga che svolgono la funzione di filtri di join utilizzando una sottoquery in una clausola WHERE, ad esempio:

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

    Si raccomanda fortemente di esprimere tale logica in un filtro di join, anziché in una sottoquery. 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.