Miglioramento delle prestazioni della replica di tipo mergeEnhance Merge Replication Performance

Dopo aver valutato i suggerimenti relativi alle prestazioni generali descritti in Miglioramento delle prestazioni generali della replica, è opportuno considerare questi ulteriori aspetti specifici della replica di tipo merge.After considering the general performance tips described in Enhancing General Replication Performance, consider these additional areas specific to merge replication.

Progettazione di databaseDatabase Design

  • Colonne di indice utilizzate in filtri di riga e filtri join.Index columns used in row filters and join filters.

    Se si applica un filtro di riga a un articolo pubblicato, è necessario creare un indice per ogni colonna specificata nella clausola WHERE del filtro.When you use a row filter on a published article, create an index on each of the columns that is used in the filter's WHERE clause. In assenza dell'indice, ogni riga della tabella deve essere letta da MicrosoftMicrosoft SQL ServerSQL Server per determinare se debba essere inclusa o meno nella partizione.Without an index, MicrosoftMicrosoft SQL ServerSQL Server has to read each row in the table to determine whether the row should be included in the partition. In presenza dell'indice, SQL ServerSQL Server è in grado di individuare rapidamente le righe da includere.With an index, SQL ServerSQL Server can quickly locate which rows should be included. L'elaborazione più rapida si ottiene quando tramite la replica è possibile risolvere completamente la clausola WHERE del filtro solo in base all'indice.The fastest processing takes place if replication can fully resolve the WHERE clause of the filter from the index alone.

    È inoltre importante indicizzare tutte le colonne utilizzate nei filtri join.Indexing all the columns used in join filters is also important. A ogni esecuzione dell'agente di merge viene eseguita la ricerca della tabella di base per determinare quali righe della tabella padre e delle tabelle correlate sono incluse in una partizione.Each time the Merge Agent runs, it searches the base table to determine which rows in a parent table and which rows in related tables are included in a partition. La creazione di un indice delle colonne unite in join consente di evitare la lettura di ogni riga della tabella da parte di SQL ServerSQL Server a ogni esecuzione dell'agente di merge.Creating an index on the joined columns avoids having SQL ServerSQL Server read each row in the table every time the Merge Agent runs.

    Per altre informazioni sui filtri, vedere Filtrare i dati pubblicati per la replica di tipo merge.For more information on filtering, see Filter Published Data for Merge Replication.

  • ‏Si considerino le tabelle in fase di sovranormalizzazione che includono tipi di dati LOB (Large Object).Consider overnormalizing tables that include Large Object (LOB) data types.

    Quando viene eseguita la sincronizzazione, è possibile che l'agente di merge debba leggere e trasferire l'intera riga di dati da un server di pubblicazione o un Sottoscrittore.When synchronization occurs, the Merge Agent might need to read and transfer the entire data row from a Publisher or Subscriber. Se la riga include colonne con dati LOB, questo processo può richiedere l'allocazione di memoria aggiuntiva e influire negativamente sulle prestazioni anche se tali colonne non sono state aggiornate.If the row contains columns that use LOBs, this process can require additional memory allocation and negatively impact performance even though these columns may not have been updated. Per ridurre la probabilità di tale impatto negativo sulle prestazioni, è possibile inserire le colonne LOB in una tabella distinta utilizzando una relazione uno-a-uno con la parte rimanente della riga di dati.To reduce the likelihood that this performance impact occurs, consider putting LOB columns in a separate table using a one-to-one relationship to the rest of the row data. I tipi di dati text, ntexte image sono deprecati.The data types text, ntext, and image are deprecated. Se è necessario includere dati LOB, è consigliabile utilizzare rispettivamente i tipi di dati varchar(max), nvarchar(max)e varbinary(max).If you do include LOBs, we recommend that you use the data types varchar(max), nvarchar(max), varbinary(max), respectively.

Progettazione della pubblicazionePublication Design

  • Impostare il livello di compatibilità della pubblicazione su 90RTM ( SQL Server 2005SQL Server 2005 o versione successiva).Use a publication compatibility level of 90RTM ( SQL Server 2005SQL Server 2005 or a later version).

    A meno che uno o più Sottoscrittori utilizzino una versione diversa di SQL ServerSQL Server, specificare che la pubblicazione deve supportare solo SQL Server 2005SQL Server 2005 o versione successiva.Unless one or more Subscribers use a different version of SQL ServerSQL Server, specify that the publication must support only SQL Server 2005SQL Server 2005 or a later version. Ciò consente di sfruttare le nuove funzionalità e le ottimizzazioni delle prestazioni.This allows the publication to take advantage of new features and performance optimizations.

  • Utilizzare impostazioni appropriate relative al periodo di memorizzazione della pubblicazione.Use appropriate publication retention settings.

    Il periodo di memorizzazione della pubblicazione, ovvero il periodo di tempo massimo prima che una sottoscrizione debba essere sincronizzata, determina la durata dell'archiviazione dei metadati di rilevamento.The publication retention period, which is the maximum amount of time before a subscription must be synchronized, determines how long tracking metadata is stored. Un valore elevato può influire sulle prestazioni di elaborazione e archiviazione.A high value can affect storage and processing performance. Per ulteriori informazioni sull'impostazione del periodo di memorizzazione della pubblicazione, vedere Subscription Expiration and Deactivation.For more information about setting the publication retention period, see Subscription Expiration and Deactivation.

  • Utilizzare articoli di solo download per le tabelle modificate solo nel server di pubblicazione.Use download-only articles on those tables that are only changed at the Publisher. Per altre informazioni, vedere Ottimizzare le prestazioni della replica di tipo merge con gli articoli di solo download.For more information, see Optimize Merge Replication Performance with Download-Only Articles.

Progettazione e utilizzo dei filtriFilter Design and Use

  • Limitare la complessità delle clausole dei filtri di riga.Limit the complexity of row filter clauses.

    Limitando la complessità dei criteri di filtro è possibile migliorare le prestazioni durante la valutazione da parte dell'agente di merge delle modifiche delle righe da inviare ai Sottoscrittori.Limiting the complexity of the filtering criteria helps improve performance when the Merge Agent is evaluating row changes to send to Subscribers. Evitare di utilizzare selezioni secondarie all'interno delle clausole dei filtri di riga.Avoid using sub-selects within merge row filter clauses. Considerare, invece, l'opportunità di utilizzare filtri di join, in genere più efficienti se utilizzati per partizionare i dati di una tabella in base alla clausola del filtro di riga di un'altra tabella.Instead, consider using join filters, which are generally more efficient when used to partition data in one table based on the row filter clause in another table. Per altre informazioni sui filtri, vedere Filtrare i dati pubblicati per la replica di tipo merge.For more information about filtering, see Filter Published Data for Merge Replication.

  • Utilizzare partizioni pre-calcolate con filtri con parametri (funzionalità utilizzata per impostazione predefinita).Use precomputed partitions with parameterized filters (this feature is used by default). Per altre informazioni, vedere Ottimizzare le prestazioni dei filtri con parametri con le partizioni pre-calcolate.For more information, see Optimize Parameterized Filter Performance with Precomputed Partitions.

    Le partizioni pre-calcolate impongono vari limiti al funzionamento dei filtri.Precomputed partitions impose a number of limits on filtering behavior. Se l'applicazione non è in grado di rispettare tali limiti, impostare l'opzione keep_partition_changes su True. Ciò consente di migliorare le prestazioni.If your application cannot adhere to these limitations, set the keep_partition_changes option to True, which provides a performance benefit. Per altre informazioni, vedere Parameterized Row Filters.For more information, see Parameterized Row Filters.

  • Utilizzare partizioni non sovrapposte se i dati vengono filtrati ma non condivisi tra gli utenti.Use nonoverlapping partitions if data is filtered but not shared among users.

    La replica consente di ottimizzare le prestazioni dei dati che non vengono condivisi tra partizioni o sottoscrizioni.Replication can optimize performance for data that is not shared between partitions or subscriptions. Per altre informazioni, vedere Parameterized Row Filters.For more information, see Parameterized Row Filters.

  • Evitare di creare gerarchie di filtri join complesse.Do not create complex join filter hierarchies.

    I filtri join composti da più di cinque tabelle possono avere un impatto decisivo sulle prestazioni durante l'elaborazione di tipo merge.Join filters with five or more tables can significantly impact performance during merge processing. Se è necessario generare filtri join per cinque o più tabelle, è consigliabile optare per altre soluzioni:We recommend that if you are generating join filters of five or more tables that you consider other solutions:

    • Evitare di filtrare le tabelle che fungono principalmente da tabelle di ricerca, le tabelle di dimensioni ridotte e le tabelle non soggette a modifica,Avoid filtering tables that are primarily lookup tables, smaller tables, and tables that are not subject to change. che è preferibile inserire nella pubblicazione senza ricorrere ad alcun filtro.Make those tables part of the publication in their entirety. È consigliabile utilizzare filtri join solo tra tabelle che devono essere partizionate tra i Sottoscrittori.We recommend that you use join filters only between tables that must be partitioned among Subscribers. Per altre informazioni, vedere Join Filters.For more information, see Join Filters.

    • Considerare la denormalizzazione della progettazione del database o l'utilizzo di una tabella di mapping qualora in un join siano presenti molte tabelle.Consider denormalizing the database design or using a mapping table if there are a large number of tables in a join. Ad esempio, se un venditore necessita solo dei dati relativi ai propri clienti e per associare un cliente a un determinato venditore sono necessari sei join, considerare l'opportunità di aggiungere alla tabella dei clienti una colonna che identifica il venditore.For example, if a sales person needs only the data for her customers, but it requires six joins to associate a customer with a sales person, consider adding a column to the customer table that identifies the sales person. I dati del venditore sono ridondanti, ma i costi della denormalizzazione delle tabelle vengono compensati in una certa misura dai vantaggi a livello delle prestazioni per la partizione della replica.The sales person data is redundant, but the costs of denormalizing the tables somewhat might be outweighed by the performance benefits for replication partitioning.

    • Per migliorare le prestazioni delle partizioni pre-calcolate quando i batch contengono molte modifiche ai dati, progettare l'applicazione con attenzione.To improve the performance of precomputed partitions when batches contain lots of data changes, design your application with care. Assicurare che le modifiche ai dati nella tabella padre in un filtro join vengano apportate prima delle corrispondenti modifiche nelle tabelle figlio.Make sure that changes to data in the parent table in a join filter are made before corresponding changes in the child tables.

  • Impostare l'opzione join_unique_key su 1 se la logica lo consente.Set the join_unique_key option to 1 if logic allows.

    Impostando questo parametro su 1 , la relazione tra le tabelle figlio e le tabelle padre in un filtro join sarà di tipo uno-a-uno o uno-a-molti.Setting this parameter to 1 indicates that the relationship between the child and parent tables in a join filter is one to one or one to many. Impostare questo parametro su 1 solo se esiste un vincolo nella colonna di join della tabella figlio che garantisce l'univocità.Only set this parameter to 1 if you have a constraint on the joining column in the child table that guarantees uniqueness. Un'impostazione non corretta del parametro su 1 può impedire la convergenza dei dati.If the parameter is set to 1 incorrectly, non-convergence of data can occur. Per altre informazioni, vedere Join Filters.For more information, see Join Filters.

  • Non eseguire batch con molte modifiche se si utilizzano partizioni pre-calcolate.Avoid executing batches with lots of changes when you use precomputed partitions.

    Se l'agente di merge viene eseguito dopo un batch che contiene molte modifiche ai dati, tenterà di suddividere il batch di grandi dimensioni in batch minori.When the Merge Agent is run after you run a batch that contains lots of data changes, the agent tries to divide the large batch into smaller batches. Nel frattempo altri processi dell'agente di merge potrebbero risultare bloccati.During this time, other Merge Agent processes may be blocked. Provare a ridurre il numero di modifiche contenute in un batch e ad eseguire l'agente di merge tra i batch.Consider reducing the number of changes in a batch and run the Merge Agent between batches. Se non è possibile, aumentare il valore di generation_leveling_threshold per la pubblicazione.If this cannot be done, increase the value of generation_leveling_threshold for the publication.

Considerazioni sulle sottoscrizioniSubscription Considerations

  • Scaglionare le pianificazioni di sincronizzazione delle sottoscrizioni.Stagger subscription synchronization schedules.

    Nel caso in cui un numero elevato di Sottoscrittori esegua la sincronizzazione con un server di pubblicazione, considerare l'opportunità di scaglionare le pianificazioni in modo che gli agenti di merge vengano eseguiti in momenti diversi.If a large number of Subscribers synchronize with a Publisher, consider staggering the schedules so that Merge Agents run at different times. Per altre informazioni, vedere Specify Synchronization Schedules.For more information, see Specify Synchronization Schedules.

Parametri dell'agente di mergeMerge Agent Parameters

Per informazioni sull'agente di merge e sui relativi parametri, vedere Replication Merge Agent.For information about the Merge Agent and its parameters, see Replication Merge Agent.

  • Aggiornare tutti i Sottoscrittori per le sottoscrizioni pull a SQL Server 2005SQL Server 2005 o versione successiva.Upgrade all Subscribers for pull subscriptions to SQL Server 2005SQL Server 2005 or a later version.

    Se si aggiorna il Sottoscrittore a SQL Server 2005SQL Server 2005 o versione successiva, viene aggiornato anche l'agente di merge utilizzato dalle sottoscrizioni nel Sottoscrittore.Upgrading the Subscriber to SQL Server 2005SQL Server 2005 or a later version upgrades the Merge Agent used by the subscriptions at that Subscriber. Per poter utilizzare molte delle nuove funzionalità e ottimizzazioni delle prestazioni, è necessario l'agente di merge di SQL Server 2005SQL Server 2005 o versione successiva.To take advantage of many of the new features and performance optimizations, the Merge Agent from SQL Server 2005SQL Server 2005 or a later version is required.

  • Se la sincronizzazione di una sottoscrizione avviene con una connessione veloce e le modifiche vengono inviate dal server di pubblicazione e dal Sottoscrittore, usare il parametro –ParallelUploadDownload per l'agente di merge.If a subscription is synchronized over a fast connection and changes are sent from the Publisher and Subscriber, use the –ParallelUploadDownload parameter for the Merge Agent.

    SQL Server 2005SQL Server 2005 ha introdotto un nuovo parametro dell'agente di merge, ovvero –ParallelUploadDownload. introduced a new Merge Agent parameter: –ParallelUploadDownload. L'impostazione di questo parametro consente di elaborare in parallelo le modifiche caricate nel server di pubblicazione e le modifiche scaricate nel Sottoscrittore.Setting this parameter allows the Merge Agent to process in parallel the changes uploaded to the Publisher and those downloaded to the Subscriber. Ciò è utile negli ambienti caratterizzati da volumi di traffico elevati con un'ampia larghezza di banda di rete.This is useful in high volume environments with high network bandwidth. I parametri degli agenti possono essere specificati nei profili agente e dalla riga di comando.Agent parameters can be specified in agent profiles and on the command line. Per altre informazioni, vedere:For more information, see:

  • Provare ad aumentare il valore del parametro -MakeGenerationInterval , in particolare se la sincronizzazione prevede più caricamenti che download dai Sottoscrittori.Consider increasing the value of the -MakeGenerationInterval parameter, especially if synchronization involves more uploads from Subscribers than downloads to Subscribers.

  • Quando si sincronizzano righe di dati con un'ingente quantità di dati, ad esempio righe con colonne LOB, la sincronizzazione tramite il Web può richiedere l'allocazione di memoria aggiuntiva e ridurre le prestazioni.When you synchronize data rows with a large amount of data, such as rows with LOB columns, Web synchronization can require additional memory allocation and hurt performance. Ciò si verifica quando l'agente di merge genera un messaggio XML contenente un numero troppo elevato di righe di dati con ingenti quantità di dati.This occurs when the Merge Agent generates an XML message that contains too many data rows with large amounts of data. Se l'agente di merge utilizza una quantità eccessiva di risorse durante la sincronizzazione tramite il Web, ridurre il numero di righe inviate in un singolo messaggio in uno dei modi seguenti:If the Merge Agent is consuming too many resources during Web synchronization, reduce the number of rows sent in a single message in one of the following ways:

    • Utilizzare il profilo agente a collegamento lento per l'agente di merge.Use the slow link agent profile for the Merge Agent. Per altre informazioni, vedere Replication Agent Profiles.For more information, see Replication Agent Profiles.

    • Ridurre i parametri - DownloadGenerationsPerBatch e - UploadGenerationsPerBatch per l'agente di merge a un valore pari a 10 o meno.Decrease the -DownloadGenerationsPerBatch and -UploadGenerationsPerBatch parameters for the Merge Agent to a value of 10 or less. Il valore predefinito di questi parametri è 50.The default value of these parameters is 50.

Considerazioni sugli snapshotSnapshot Considerations

  • Creare una colonna ROWGUIDCOL nelle tabelle di grandi dimensioni prima di generare lo snapshot iniziale.Create a ROWGUIDCOL column on large tables prior to generating the initial snapshot.

    La replica di tipo merge richiede che ogni tabella pubblicata includa una colonna ROWGUIDCOL.Merge replication requires that each published table have a ROWGUIDCOL column. Se la colonna ROWGUIDCOL non è disponibile quando l'agente snapshot crea i file di snapshot iniziali, l'agente dovrà innanzitutto aggiungere e popolare la colonna ROWGUIDCOL.If a ROWGUIDCOL column does not exist in the table before the Snapshot Agent creates the initial snapshot files, the agent must first add and populate the ROWGUIDCOL column. Per migliorare le prestazioni delle operazioni di generazione di snapshot durante la replica di tipo merge, creare la colonna ROWGUIDCOL in tutte le tabelle prima della pubblicazione.To gain a performance advantage when generating snapshots during merge replication, create the ROWGUIDCOL column on each table before publishing. Anche se, per impostazione predefinita, l'agente snapshot utilizza il nomerowguid , a tale colonna può essere assegnato qualsiasi nome che includa le funzionalità seguenti relative al tipo di dati:The column can have any name (rowguid is used by the Snapshot Agent by default), but must have the following data type characteristics:

    • Un tipo di dati UNIQUEIDENTIFIER.A data type of UNIQUEIDENTIFIER.

    • Un valore predefinito di tipo NEWSEQUENTIALID() o NEWID().A default of NEWSEQUENTIALID() or NEWID(). Per garantire un migliore livello di prestazioni durante l'inserimento e il rilevamento di modifiche, è consigliabile utilizzare NEWSEQUENTIALID().NEWSEQUENTIALID() is recommended because it can provide increased performance when making and tracking changes.

    • Il set di proprietà ROWGUIDCOL.The ROWGUIDCOL property set.

    • Un indice univoco nella colonna.A unique index on the column.

  • Creare snapshot preliminari e/o consentire ai Sottoscrittori di richiedere la generazione e l'applicazione di snapshot alla prima sincronizzazione.Pre-generate snapshots and/or allow Subscribers to request snapshot generation and application the first time they synchronize.

    Utilizzare una o entrambe le opzioni per generare snapshot per le pubblicazioni che utilizzando filtri con parametri.Use one or both of these options to provide snapshots for publications that use parameterized filters. Se non si specifica alcuna opzione, le sottoscrizioni vengono inizializzate tramite una serie di istruzioni SELECT e INSERT, anziché tramite l'utilità bcp . Questo processo risulta decisamente più lento.If you do not specify one of these options, subscriptions are initialized using a series of SELECT and INSERT statements, rather than using the bcp utility; this process is much slower. Per altre informazioni, vedere Snapshots for Merge Publications with Parameterized Filters.For more information, see Snapshots for Merge Publications with Parameterized Filters.

Considerazioni sulla manutenzione e sul monitoraggioMaintenance and Monitoring Considerations

  • Eseguire occasionalmente la reindicizzazione delle tabelle di sistema per la replica di tipo merge.Occasionally re-index merge replication system tables.

    Come parte della manutenzione per la replica di tipo merge, controllare occasionalmente l'aumento delle dimensioni delle tabelle di sistema associate alla replica di tipo merge: MSmerge_contents, MSmerge_genhistorye MSmerge_tombstone, MSmerge_current_partition_mappingse MSmerge_past_partition_mappings.As part of maintenance for merge replication, occasionally check the growth of the system tables associated with merge replication: MSmerge_contents, MSmerge_genhistory, and MSmerge_tombstone, MSmerge_current_partition_mappings, and MSmerge_past_partition_mappings. Reindicizzare periodicamente queste tabelle.Periodically re-index these tables. Per altre informazioni, vedere Riorganizzare e ricompilare gli indici.For more information, see Reorganize and Rebuild Indexes.

  • Monitorare le prestazioni della sincronizzazione utilizzando la scheda Cronologia sincronizzazione in Monitoraggio replica.Monitor synchronization performance using the Synchronization History tab in Replication Monitor.

    Per la replica di tipo merge in Monitoraggio replica nella scheda Cronologia sincronizzazione vengono visualizzate statistiche dettagliate di ogni articolo elaborato durante la sincronizzazione, inclusa la quantità di tempo impiegato in ogni fase di elaborazione (caricamento delle modifiche, download delle modifiche e così via).For merge replication, Replication Monitor displays detailed statistics in the Synchronization History tab for each article processed during synchronization, including the amount of time spent in each processing phase (uploading changes, downloading changes, and so on). Ciò può essere utile per individuare tabelle specifiche che determinano rallentamenti ed è l'opzione migliore per risolvere problemi relativi alle prestazioni delle sottoscrizioni di tipo merge.It can help pinpoint specific tables that are causing slow downs and is the best place to troubleshoot performance issues with merge subscriptions. Per altre informazioni sulla visualizzazione di statistiche dettagliate, vedere Visualizzare le informazioni ed eseguire attività relative agli agenti associati a una sottoscrizione (Monitoraggio replica).For more information on viewing detailed statistics, see View Information and Perform Tasks for the Agents Associated With a Subscription (Replication Monitor).