Progettazione di partizioni per la gestione di subset di dati

Mediante il partizionamento di tabelle o indici è possibile spostare i subset di dati in modo semplice e rapido utilizzando l'istruzione Transact-SQL ALTER TABLE...SWITCH nelle operazioni seguenti:

  • Aggiunta di una tabella come partizione di una tabella partizionata esistente.

  • Spostamento di una partizione da una tabella partizionata all'altra.

  • Rimozione di una partizione per creare una singola tabella.

Queste operazioni si rivelano utili per aggiungere nuovi dati a una tabella partizionata e rimuovere dati obsoleti dalla stessa tabella partizionata a intervalli regolari. È possibile aggiungere o rimuovere piccole e grandi quantità di dati in un'ampia gamma di scenari. Se i nuovi dati da aggiungere devono essere caricati, ripuliti o trasformati, è possibile trattarli come un'entità distinta prima di aggiungerli sotto forma di partizione. I dati obsoleti possono essere archiviati. Indipendentemente dalla quantità di dati, il trasferimento è semplice e rapido perché, a differenza dell'istruzione INSERT INTO SELECT FROM, i dati non vengono spostati fisicamente. Solo i metadati relativi alla posizione di archiviazione cambiano da una partizione all'altra.

Scenario di esempio

Nel contesto del partizionamento del database di esempio AdventureWorks2008R2, Adventure Works Cycles archivia i dati obsoleti della tabella TransactionHistory nella tabella TransactionHistoryArchive cambiando partizioni tra le due tabelle. Ciò viene eseguito partizionando la tabella TransactionHistory nel campo TransactionDate. L'intervallo di valori per ogni partizione è un mese. Nella tabella TransactionHistory vengono mantenute le transazioni più recenti dell'anno, mentre nella tabella TransactionHistoryArchive vengono mantenute le transazioni meno recenti. Partizionando le tabelle in questo modo, è possibile trasferire mensilmente i dati vecchi di un anno relativi a un singolo mese dalla tabella TransactionHistory alla tabella TransactionHistoryArchive.

All'inizio di ogni mese, i dati relativi al mese più lontano nel tempo inclusi nella tabella TransactionHistory vengono spostati nella tabella TransactionHistoryArchive. A tale scopo, è necessario che:

  1. La tabella TransactionHistoryArchive abbia lo stesso schema di progettazione della tabella TransactionHistory. È inoltre necessaria una partizione vuota in cui inserire i nuovi dati. In questo caso, TransactionHistoryArchive è una tabella partizionata costituita unicamente da due partizioni. In una partizione sono contenuti tutti i dati prima di settembre 2003, nell'altra partizione tutti i dati da settembre 2003 in poi. Quest'ultima partizione è vuota.

    Struttura delle tabelle prima del cambio di partizioni

  2. La funzione di partizione della tabella TransactionHistoryArchive venga modificata per dividere la partizione vuota in due, con una partizione definita in modo da accogliere la nuova partizione per i dati di settembre 2003.

    Primo passaggio del cambio di partizioni

  3. La prima partizione della tabella TransactionHistory, che contiene tutti i dati creati durante il mese di settembre 2003, venga spostata nella seconda partizione della tabella TransactionHistoryArchive. Si noti che è necessario definire un vincolo CHECK nella tabella TransactionHistory affinché non vengano specificati dati anteriori al primo settembre (TransactionDate >= '9/01/2003'). Questo vincolo garantisce che la partizione 1 contenga solo i dati del mese di settembre 2003 e che questi siano pronti per il trasferimento nella partizione dedicata ai dati di settembre 2003 della tabella TransactionHistoryArchive. Si noti inoltre che, prima di procedere al trasferimento, è necessario rimuovere o disabilitare gli eventuali indici non allineati alle rispettive tabelle. Gli indici possono essere creati nuovamente dopo il trasferimento. Per ulteriori informazioni sull'allineamento di indici partizionati, vedere Linee guida specifiche per gli indici partizionati.

    Secondo passaggio del cambio di partizioni

  4. La funzione di partizione della tabella TransactionHistory venga modificata per unire le prime due partizioni in un'unica partizione. Questa partizione, ora partizione 1, contiene tutti i dati creati nel mese di ottobre 2003 e verrà trasferita nella tabella TransactionHistoryArchive il mese successivo, a condizione che il vincolo CHECK esistente venga modificato affinché non vengano specificati dati anteriori al primo ottobre (TransactionDate >= '10/01/2003').

    Terzo passaggio del cambio di partizioni

  5. La funzione di partizione della tabella TransactionHistoryArchive venga nuovamente modificata per unire la seconda partizione, che contiene i dati di settembre appena aggiunti, alla prima. In questo modo viene ripristinata la condizione originale della tabella TransactionHistoryArchive, in cui tutti i dati sono inclusi nella prima partizione, mentre la seconda partizione è vuota.

    Quarto passaggio del cambio di partizioni

  6. La funzione di partizione della tabella TransactionHistory venga nuovamente modificata per dividere l'ultima partizione in due, in modo che il mese più recente venga separato dal mese precedente e che la partizione sia pronta a ricevere nuovi dati.

    Quinto passaggio del cambio di partizioni

Per uno script Transact-SQL che implementa questo scenario, vedere l'esempio ReadMe_SlidingWindow. Per informazioni sugli esempi, vedere Considerazioni per l'installazione di esempi e di database di esempio di SQL Server.