Trasferimento efficiente dei dati mediante lo spostamento di partizioni

Data aggiornamento: 12 dicembre 2006

È possibile utilizzare l'istruzione Transact-SQL ALTER TABLE...SWITCH per trasferire in modo rapido ed efficiente blocchi 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 relativi allo spostamento di partizioni, vedere Progettazione di partizioni per la gestione di subset di dati. Per visualizzare codice di esempio che implementa lo spostamento di partizioni, vedere Readme_SlidingWindow.

Requisiti generali per lo spostamento di partizioni

Quando si trasferisce una partizione, non si spostano fisicamente i dati. Si modificano solo i metadati relativi alla posizione di archiviazione dei dati. Ciò significa che 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).

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.

Se si riassegna una partizione per formare una tabella non partizionata, la tabella che riceve la partizione deve essere già stata creata e deve essere vuota.

Se si sposta una partizione da una tabella partizionata in un'altra, entrambe le tabelle devono essere partizionate in base alla stessa colonna.

Sia l'origine che la 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, o partizioni di indice. Il filegroup, tuttavia, può essere diverso da quello delle tabelle corrispondenti o di altri indici corrispondenti.

Requisiti per la struttura di tabelle e indici

Sia la tabella di origine che la tabella di destinazione devono avere la stessa struttura. Ne conseguono le osservazioni seguenti:

  • 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. 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.
    ms191160.Caution(it-it,SQL.90).gifAttenzione:
    L'esecuzione dello 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, ovvero devono essere entrambe 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 essere in accordo con la colonna di partizionamento dell'altra tabella.
    ms191160.note(it-it,SQL.90).gifImportante:
    Si consiglia di specificare NOT NULL sulla colonna di partizionamento di tabelle partizionate oppure di tabelle non partizionate che rappresentano origini o destinazioni di operazioni ALTER TABLE...SWITCH. In questo modo per i vincoli CHECK su colonne di partizionamento non sarà necessario 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.
  • 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.
  • Tutte le colonne definite con la proprietà ROWGUID devono corrispondere a una colonna dell'altra tabella definita anch'essa con la proprietà ROWGUID.
  • Tutte le colonne xml devono essere tipizzate in base alle stesse regole di confronto dello schema XML.
  • Le impostazioni all'interno di righe delle colonne text, ntext o image devono essere uguali. Per ulteriori informazioni su questa impostazione, vedere Dati all'interno di righe.
  • Le tabelle devono avere gli stessi indici cluster. Non è possibile disabilitare questi indici.
  • Tutti gli indici non cluster definiti nella tabella di destinazione sono definiti anche nella tabella di origine e sono strutturati in modo identifico 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

Tutti i vincoli CHECK definiti nella tabella di destinazione sono definiti anche nella tabella di origine come corrispondenza esatta o come applicabili al vincolo CHECK 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 vincolo i cui valori siano un subset del vincolo della tabella di destinazione, ad esempio Column1 < 90. Per definire i vincoli CHECK che specificano più colonne è necessario utilizzare la stessa sintassi.

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.

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.

ms191160.Caution(it-it,SQL.90).gifAttenzione:
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.

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 disattivazione 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:

  • Tutti gli indici della tabella di origine o della tabella di destinazione devono essere allineati con la tabella, indipendentemente dal fatto che la tabella di origine o la tabella di destinazione o entrambe siano partizionate.

  • Non possono esistere indici full-text nella tabella di origine o nella tabella di destinazione.

  • Non possono esistere indici XML nella tabella di destinazione.

  • 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 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.

  • La tabella di origine e la tabella di destinazione non possono far parte di una vista con associazione di schema. Non è possibile, pertanto, definire in esse viste indicizzate.

  • Non possono esistere regole definite nella tabella di origine o nella tabella 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.

  • Né la tabella di origine né la tabella di destinazione possono essere origini della replica.

  • Uno spostamento di partizione comporta l'esecuzione di un'istruzione ALTER TABLE. È necessario, pertanto, disporre delle autorizzazioni per il database necessarie per l'istruzione ALTER TABLE. Non è necessario che il set di autorizzazioni sia lo stesso per la tabella di origine e la tabella di destinazione.

Spostando le partizioni di tabelle non vengono attivati trigger INSERT, UPDATE o DELETE né operazioni di propagazione. Per spostare le partizioni non è necessario che per le tabelle di origine o di destinazione siano definiti trigger in modo simile.

[!NOTA] Eseguendo 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 persino ai metadati delle tabelle durante la modifica. Per ulteriori informazioni sui blocchi, vedere Modalità blocco.

Per spostare partizioni di tabelle

Vedere anche

Concetti

Progettazione di partizioni per la gestione di subset di dati

Altre risorse

DBCC CHECKIDENT (Transact-SQL)
ALTER PARTITION FUNCTION (Transact-SQL)
ALTER PARTITION SCHEME (Transact-SQL)
Readme_SlidingWindow

Guida in linea e informazioni

Assistenza su SQL Server 2005

Cronologia modifiche

Versione Cronologia

12 dicembre 2006

Nuovo contenuto:

Aggiunta di una nota per consigliare di specificare NOT NULL sulla colonna di partizionamento di tabelle partizionate oppure di tabelle non partizionate che rappresentano origini o destinazioni di operazioni ALTER TABLE...SWITCH.

14 aprile 2006

Contenuto modificato:
  • Gli indici XML definiti nella tabella di origine non incidono sullo spostamento di partizioni. Per spostare partizioni, non possono esistere indici XML nella tabella di destinazione.