Trasferimento efficiente dei dati mediante lo spostamento di partizioni
Il partizionamento dei dati consente di gestire e accedere in modo rapido ed efficace a subset di dati, salvaguardando al contempo l'integrità dell'intera raccolta di dati. È possibile utilizzare l'istruzione Transact-SQL ALTER TABLE...SWITCH per trasferire in modo rapido ed efficiente subset di dati tramite:
Assegnazione di una tabella come partizione a una tabella partizionata esistente.
Spostamento di una partizione da una tabella partizionata a un'altra.
Riassegnazione di una partizione per formare una sola tabella.
Per informazioni sui concetti di spostamento delle partizioni e per visualizzare l'esempio ReadMe_SlidingWindow. Per informazioni sugli esempi, vedere Considerazioni per l'installazione di esempi e di database di esempio di SQL Server.
Requisiti generali per lo spostamento di partizioni
Quando una partizione viene trasferita, i dati non vengono spostati fisicamente. Vengono solo modificati i metadati relativi alla posizione dei dati. Prima di poter spostare le partizioni, è necessario soddisfare alcuni requisiti generali:
Entrambe le tabelle devono esistere prima dell'operazione SWITCH. Prima di eseguire l'operazione SWITCH nel database, devono esistere sia la tabella da cui viene spostata la partizione (la tabella di origine), sia la tabella che riceve la partizione (la tabella di destinazione).
La partizione ricevente deve esistere e deve essere vuota. Se si aggiunge una tabella come partizione a una tabella partizionata già esistente o si sposta una partizione da una tabella partizionata in un'altra, la partizione ricevente deve esistere e deve essere vuota.
La tabella ricevente non partizionata deve esistere e deve essere vuota. Se si riassegna una partizione per formare una tabella non partizionata, la tabella che riceve la nuova partizione deve esistere e deve essere una tabella vuota non partizionata.
Le partizioni devono essere nella stessa colonna. Se si sposta una partizione da una tabella partizionata in un'altra, entrambe le tabelle devono essere partizionate in base alla stessa colonna.
Le tabelle di origine e di destinazione devono condividere lo stesso filegroup. Sia la tabella di origine che la tabella di destinazione dell'istruzione ALTER TABLE...SWITCH devono trovarsi nello stesso filegroup e le colonne per valori di grandi dimensioni devono essere archiviate nello stesso filegroup. Nello stesso filegroup devono trovarsi anche i corrispondenti indici, partizioni di indice o partizioni di viste indicizzate. Il filegroup, tuttavia, può essere diverso da quello delle tabelle corrispondenti o di altri indici corrispondenti.
Per informazioni sullo spostamento delle partizioni quando le viste indicizzate sono definite, vedere Spostamento di partizioni se le viste indicizzate sono definite.
Requisiti per la struttura di tabelle e indici
Oltre ai precedenti requisiti generali, sia la tabella di origine che la tabella di destinazione devono avere la stessa struttura. Devono essere soddisfatti i requisiti di struttura seguenti:
Le tabelle di origine e di destinazione devono avere la stessa struttura e ordine delle colonne. Le tabelle devono avere le stesse colonne, con gli stessi nomi e gli stessi tipi di dati, lunghezza, regole di confronto, precisione, scala, supporto di valori Null e vincoli PRIMARY KEY (se presenti). Inoltre devono avere le stesse impostazioni per ANSI_NULLS e QUOTED IDENTIFIER. Le colonne devono, inoltre, essere definite nello stesso ordine. La proprietà IDENTITY non viene considerata.
Attenzione Lo spostamento di partizioni può introdurre valori duplicati nelle colonne IDENTITY della tabella di destinazione e vuoti nei valori delle colonne IDENTITY nella tabella di origine. Utilizzare DBCC CHECKIDENT per controllare i valori Identity delle tabelle e correggerli, se necessario.
Le colonne di partizionamento devono essere coerenti per quanto riguarda il supporto dei valori Null. Le tabelle di origine e di destinazione devono essere NULL o NOT NULL. Se una delle tabelle non è partizionata, il supporto dei valori Null della colonna corrispondente alla colonna di partizionamento dell'altra tabella deve corrispondere alla colonna della tabella partizionata.
Importante Si consiglia di specificare NOT NULL nella colonna di partizionamento delle tabelle partizionate. Si consiglia inoltre di specificare NOT NULL sulle tabelle non partizionate che rappresentano origini o destinazioni di operazioni ALTER TABLE...SWITCH. Quando le colonne partizionate sono NOT NULL, gli eventuali vincoli CHECK sulle colonne di partizionamento non vengono obbligati a verificare la presenza di valori Null. I valori Null si trovano in genere nella partizione più a sinistra di una tabella partizionata. Quando si cambia una partizione diversa dalla partizione più a sinistra e l'opzione di database ANSI_NULLS è impostata su ON, l'assenza di un vincolo NOT NULL nelle tabelle di origine e destinazione potrebbe interferire con eventuali vincoli CHECK definiti sulla colonna di partizionamento.
Le colonne calcolate devono avere la stessa sintassi. Se le chiavi di partizione corrispondenti sono colonne calcolate, la sintassi delle espressioni che definiscono le colonne calcolate è la stessa ed entrambe le colonne calcolate sono persistenti.
Le proprietà ROWGUID devono essere le stesse. Tutte le colonne definite con la proprietà ROWGUID devono corrispondere a una colonna dell'altra tabella definita anch'essa con la proprietà ROWGUID.
Le colonne XML devono avere lo stesso schema. Tutte xmlle colonne devono essere tipizzate in base alla stessa raccolta di XML Schema.
Le impostazioni all'interno delle righe di qualsiasi colonna text, ntext o image devono essere le stesse. Per ulteriori informazioni su questa impostazione, vedere Dati all'interno di righe.
Le tabelle devono avere gli stessi indici cluster. Sia le tabelle di origine che le tabelle di destinazione devono avere gli stessi indici cluster e tali indici non possono essere disabilitati prima dello spostamento delle partizioni.
Gli indici non cluster devono essere definiti e devono essere identici. Tutti gli indici non cluster definiti nella tabella di destinazione sono definiti anche nella tabella di origine e sono strutturati in modo identico in termini di unicità, sottochiavi e criterio di ordinamento (ASC o DESC) per ogni colonna chiave indice. Questo requisito non vale per gli indici non cluster disabilitati.
Requisiti per i vincoli
Per poter spostare le partizioni è necessario che vengano soddisfatti anche i seguenti requisiti per i vincoli:
I vincoli CHECK devono essere una corrispondenza esatta o applicabile sia all'origine che alla destinazione. Tutti i vincoli CHECK definiti nella tabella di destinazione sono definiti anche nella tabella di origine come corrispondenza esatta o come applicabili (ad esempio, come subset) ai vincoli CHECK della tabella di destinazione.
I vincoli nelle colonne int devono essere gli stessi o un subset. Qualsiasi vincolo CHECK in colonne int nella tabella di origine deve corrispondere o esistere come subset dei vincoli nella colonna int della tabella di destinazione. Se, ad esempio, la tabella di destinazione presenta un vincolo in una colonna intColumn1 che specifica Column1 < 100, la corrispondente colonna Column1 della tabella di origine deve avere lo stesso vincolo oppure un subset del vincolo posto sui valori della tabella di destinazione, ad esempio Column1 < 90 della tabella origine. I vincoli CHECK che specificano più colonne devono essere definiti utilizzando la stessa sintassi.
Le tabelle non partizionate devono avere gli stessi vincoli della partizione di destinazione. Se si aggiunge una tabella non partizionata come partizione a una tabella partizionata esistente, è necessario che sia presente un vincolo definito nella colonna della tabella di origine corrispondente alla chiave di partizione della tabella di destinazione. In questo modo si ha la certezza che l'intervallo di valori rientri nei valori limite della partizione di destinazione.
I valori limite della partizione di origine devono essere compresi all'interno del limite della partizione di destinazione. Se si sposta una partizione di una tabella partizionata in un'altra tabella partizionata, i valori limite della partizione di origine devono essere compresi nei valori limite della partizione di destinazione. In caso contrario è necessario che vi sia un vincolo definito per la chiave di partizione della tabella di origine, in modo da avere la certezza che tutti i dati della tabella rientrino nei valori limite della partizione di destinazione.
Attenzione Evitare la conversione dei tipi di dati nelle definizioni dei vincoli. L'esecuzione dell'istruzione ALTER TABLE...SWITCH può avere esito negativo in presenza di vincoli che prevedono la conversione dei tipi di dati implicita o esplicita e che sono definiti in tabelle che rappresentano origini per lo spostamento di partizioni.
Le tabelle di origine e di destinazione devono avere gli stessi vincoli FOREIGN KEY. Se la tabella di destinazione prevede vincoli FOREIGN KEY, nelle colonne corrispondenti della tabella di origine devono essere definite le stesse chiavi esterne, che devono fare riferimento alla stessa chiave primaria di quelle della tabella di destinazione. Le chiavi esterne della tabella di origine non possono essere contrassegnate con is_not_trusted (visualizzabile nella vista del catalogo sys.foreign_keys), a meno che la corrispondente chiave esterna della tabella di destinazione non sia anch'essa contrassegnata con is_not_trusted. Per ulteriori informazioni su questa impostazione, vedere Linee guida per la disabilitazione di indici. In SQL Server vengono applicate tutte le regole CASCADE definite nelle chiavi esterne della tabella di destinazione alla partizione appena spostata.
Ulteriori requisiti per lo spostamento di partizioni
Per poter spostare le partizioni è necessario che vengano soddisfatti anche i requisiti seguenti:
Gli indici devono essere allineati con le partizioni della tabella. Gli indici nella tabella di origine devono essere allineati con la tabella di origine, gli indici nella tabella di destinazione devono essere allineati con la tabella di destinazione. La tabella di origine e la tabella di destinazione possono essere entrambe partizionate, non partizionate oppure può esserlo una sola di esse. Per ulteriori informazioni sull'allineamento degli indici, vedere Linee guida specifiche per gli indici partizionati.
I vincoli e i requisiti aggiuntivi si applicano alle tabelle di origine con le viste indicizzate. Se la tabella di destinazione nell'istruzione ALTER TABLE … SWITCH ha una vista indicizzata definita, vedere Spostamento di partizioni se le viste indicizzate sono definite per informazioni sui vincoli ed esempi.
Non sono consentiti indici full-text. Non possono esistere indici full-text nella tabella di origine o nella tabella di destinazione.
Non sono consentiti indici XML nella tabella di destinazione. Non possono esistere indici XML nella tabella di destinazione.
Non sono definite chiavi primarie o chiavi esterne se la tabella di origine dispone della chiave primaria. Non può esistere alcuna relazione attiva chiave primaria/chiave esterna tra la tabella di origine e la tabella di destinazione in cui la tabella di origine contiene la chiave primaria.
Non sono definite chiavi primarie o chiavi esterne se la tabella di destinazione dispone della chiave esterna. Non può esistere alcuna relazione attiva chiave primaria/chiave esterna tra la tabella di origine e la tabella di destinazione in cui la tabella di destinazione contiene la chiave esterna.
Alla tabella di origine non può fare riferimento una chiave esterna di un'altra tabella. Alla tabella di origine non può fare riferimento una chiave esterna di un'altra tabella.
Non sono consentite regole nella tabella di origine o di destinazione. Non possono esistere regole definite nella tabella di origine o nella tabella di destinazione. I vincoli CHECK possono essere utilizzati nella tabella di origine e di destinazione.
Nota
Le regole sono una caratteristica disponibile per la compatibilità con le versioni precedenti. L'implementazione consigliata prevede l'utilizzo di vincoli CHECK. Per informazioni sulle restrizioni relative ai vincoli CHECK, vedere Requisiti per i vincoli più indietro in questo argomento.
Le tabelle di origine e di destinazione non devono essere replicate. Né la tabella di origine né la tabella di destinazione possono essere origini della replica.
È necessario richiedere le autorizzazioni per i database prima dello spostamento delle partizioni. Poiché nello spostamento delle partizioni viene utilizzata un'istruzione ALTER TABLE, è necessario disporre delle autorizzazioni per il database associate all'istruzione ALTER TABLE. Non è necessario che il set di autorizzazioni sia lo stesso per la tabella di origine e la tabella di destinazione.
Durante lo spostamento delle partizioni non devono essere attivati trigger. Spostando le partizioni di tabelle non vengono attivati trigger INSERT, UPDATE o DELETE né azioni di propagazione. Per spostare le partizioni non è necessario che per le tabelle di origine o di destinazione siano definiti trigger in modo simile.
Nota
Durante un'operazione ALTER TABLE…SWITCH in entrambe le tabelle di origine e di destinazione viene acquisito un blocco di modifica dello schema in modo da garantire che nessun'altra connessione faccia riferimento alle tabelle durante la modifica. Per ulteriori informazioni sui blocchi, vedere Modalità blocco.
Per spostare partizioni di tabelle