Replicare tabelle e indici partizionati

Si applica a:SQL Server e Istanza gestita di SQL di Azure

Il partizionamento semplifica la gestione di indici e tabelle di grandi dimensioni, in quanto consente di gestire e accedere in modo rapido ed efficace a subset di dati, preservando al contempo l'integrità di una raccolta dati. Per ulteriori informazioni, vedere Partitioned Tables and Indexes. La replica supporta il partizionamento fornendo un set di proprietà che specificano la modalità di gestione di tabelle e indici partizionati.

Proprietà degli articoli per la replica transazionale e di tipo merge

Nella tabella seguente sono inclusi gli oggetti utilizzati per partizionare i dati.

Oggetto Creato utilizzando
Tabella o indice partizionato CREATE TABLE oppure CREATE INDEX
Funzione di partizione CREATE PARTITION FUNCTION
Schema di partizione CREATE PARTITION SCHEME

Le proprietà di partizionamento sono le opzioni dello schema dell'articolo che determinano se gli oggetti di partizionamento devono essere copiati al Sottoscrittore. Imposta queste opzioni di schema nei seguenti modi:

  • Nella pagina Proprietà dell'articolo della Creazione guidata Nuova pubblicazione o nella finestra di dialogo Proprietà pubblicazione. Per copiare gli oggetti elencati nella tabella precedente, specificare un valore true per le proprietà Copia schemi di partizione delle tabelle e Copia schemi di partizione dell'indice. Per informazioni su come accedere alla pagina Proprietà articolo, vedere Visualizzare e modificare le proprietà della pubblicazione.

  • Utilizzando il parametro schema_option di una delle stored procedure seguenti:

    Per copiare gli oggetti elencati nella tabella precedente, specificare i valori dell'opzione dello schema appropriati. Per informazioni su come specificare le opzioni dello schema, vedere Specify Schema Options.

Tramite la replica vengono copiati gli oggetti nel Sottoscrittore durante la sincronizzazione iniziale. Se lo schema di partizione utilizza filegroup diversi dal filegroup PRIMARY, tali filegroup devono essere presenti nel Sottoscrittore prima della sincronizzazione iniziale.

Al termine dell'inizializzazione del Sottoscrittore, le modifiche dei dati vengono propagate al Sottoscrittore e applicate alle partizioni appropriate. Tuttavia, le modifiche allo schema di partizione non sono supportate. La replica transazionale e la fusione non supportano la replica dei seguenti comandi: ALTER PARTITION FUNCTION, ALTER PARTITION SCHEME, o l'istruzione REBUILD WITH PARTITION di ALTER INDEX. Le modifiche associate a essi non vengono automaticamente replicate all'Abbonato. Devi apportare manualmente modifiche simili nel Sottoscrittore.

Supporto alla replicazione per il cambio di partizioni

Uno dei vantaggi principali del partizionamento di tabelle consiste nella possibilità di spostare in modo rapido ed efficiente subset di dati tra partizioni. Usa il SWITCH PARTITION comando per spostare i dati. Di default, quando si abilita una tabella per la replica, il sistema blocca SWITCH PARTITION le operazioni per i seguenti motivi:

  • Se sposti dati dentro o fuori da una tabella che esiste presso l'Publisher ma non esiste nell'Abbonato, Publisher e Abbonato potrebbero diventare incoerenti tra loro. Questo problema si verifica tipicamente quando si spostano dati dentro o fuori da una tabella di staging.

  • Se l'Abbonato ha una definizione diversa per la tabella partizionata rispetto all'Publisher, l'agente di distribuzione fallisce quando tenta di applicare modifiche all'Abbonato.

Nonostante questi potenziali problemi, puoi abilitare il cambio di partizione per la replica transazionale. Prima di abilitare il cambio di partizione, assicurati che tutte le tabelle coinvolte nello scambio di partizione siano presenti sia presso Publisher che Subscriber, e assicurati che le definizioni di tabella e partizione siano identiche.

Quando le partizioni hanno esattamente lo stesso schema di partizionamento nei server di pubblicazione e di sottoscrizione, è possibile abilitare allow_partition_switch insieme a replication_partition_switch, in modo da replicare al sottoscrittore solo l’istruzione di cambio partizione. È inoltre possibile abilitare allow_partition_switch senza replicare la DDL. Questa operazione è utile nel caso in cui si desideri rimuovere gradualmente i mesi più vecchi dalla partizione, pur mantenendo la partizione replicata nel sottoscrittore per un altro anno a scopo di backup.

Se si abilita il cambio di partizione in SQL Server dalla versione 2008 R2 fino a quella corrente, potrebbero rendersi necessarie anche operazioni di suddivisione e unione in un prossimo futuro. Prima di eseguire un'operazione di split o merge su una tabella replicata o abilitata a CDC, assicurati che la partizione in questione non abbia comandi replicati in sospeso. È anche necessario assicurarsi che nessuna operazione DML venga eseguita sulla partizione durante le operazioni di divisione e unione. Se ci sono transazioni che il lettore di log o il lavoro di cattura CDC non hanno processato, oppure se esegui operazioni DML su una partizione di una tabella replicata o abilitata a CDC mentre è in esecuzione un'operazione di split o merge (coinvolgendo la stessa partizione), potrebbe causare un errore di elaborazione (errore 608 - Nessuna voce di catalogo trovata per l'ID partizione) con un agente del lettore di log o un lavoro di cattura CDC. Per correggere l'errore, potresti dover riavvializzare l'abbonamento o disabilitare il CDC su quella tabella o database.

Scenari non supportati

I seguenti scenari non sono supportati quando si utilizza la replica con commutazione di partizioni:

Replicazione peer-to-peer
La replica peer-to-peer non è supportata con il cambio di partizione.

Uso di variabili con cambio della partizione

L'uso di variabili con cambio di partizione su tabelle pubblicate con replicazione transazionale o Change Data Capture (CDC) non è supportato per questa ALTER TABLE ... SWITCH TO ... PARTITION ... istruzione.

Ad esempio, il seguente codice di commutazione di partizione non funziona con CDC abilitato per il database, né quando TableA partecipa a una pubblicazione transazionale:

DECLARE @SomeVariable INT = $PARTITION.pf_test(10);
ALTER TABLE dbo.TableA
SWITCH TO dbo.TableB 
PARTITION @SomeVariable;

Invece, cambia la partizione usando direttamente la funzione di partizione, come nel seguente esempio:

ALTER TABLE NonPartitionedTable 
SWITCH TO PartitionedTable PARTITION $PARTITION.pf_test(10);

Abilitazione dello scambio di partizioni

Le seguenti proprietà per le pubblicazioni transazionali ti permettono di controllare il comportamento del cambio di partizione in un ambiente replicato:

  • @allow_partition_switch: Quando impostato su true, puoi eseguire SWITCH PARTITION contro il database di pubblicazione.

  • @replicate_partition_switch: Determina se replicare l'istruzione DDL SWITCH PARTITION ai Sottoscrittori. Questa opzione è valida solo quando @allow_partition_switch è impostata su true.

Imposta queste proprietà usando sp_addpublication quando crei la pubblicazione, oppure usando sp_changepublication dopo aver creato la pubblicazione. Come detto prima, la replica di fusione non supporta il cambio di partizione. Per eseguire SWITCH PARTITION su una tabella abilitata per la replica di merge, rimuovi la tabella dalla pubblicazione.