Compito
Archivia tutti tranne un periodo di 13 mesi a rotazione da un gruppo di grandi tabelle. I dati archiviati devono essere archiviati in un altro database.
- Il database è in modalità di recupero semplice
- Le tabelle sono da 50 mil file a diversi miliardi e in alcuni casi occupano centinaia di GB ciascuno.
- Le tabelle non sono attualmente partizionate
- Ogni tabella ha un indice cluster su una colonna di data sempre crescente
- Ogni tabella ha inoltre un indice non cluster
- Tutte le modifiche ai dati delle tabelle sono inserti
- L'obiettivo è ridurre al minimo i tempi di inattività del database primario.
- Il server è 2008 R2 Enterprise
La tabella "archivio" avrà circa 1,1 miliardi di righe, la tabella "live" circa 400 milioni. Ovviamente la tabella degli archivi aumenterà nel tempo, ma mi aspetto che anche la tabella live aumenti abbastanza rapidamente. Di 'almeno il 50% nei prossimi due anni.
Avevo pensato ai database stretch di Azure, ma sfortunatamente siamo al 2008 R2 e probabilmente resteremo lì per un po '.
Piano attuale
- Crea un nuovo database
- Crea nuove tabelle partizionate per mese (usando la data modificata) nel nuovo database.
- Sposta gli ultimi 12-13 mesi di dati nelle tabelle partizionate.
- Eseguire uno scambio di ridenominazione dei due database
- Elimina i dati spostati dal database ora "archivio".
- Partizionare ciascuna delle tabelle nel database "archivio".
- Utilizzare gli scambi di partizioni per archiviare i dati in futuro.
- Mi rendo conto che dovrò scambiare i dati da archiviare, copiare quella tabella nel database di archivio e quindi scambiarli nella tabella di archivio. Questo è accettabile
Problema: sto cercando di spostare i dati nelle tabelle partizionate iniziali (in effetti sto ancora facendo una prova del concetto su di esso). Sto cercando di utilizzare TF 610 (secondo la Guida alle prestazioni di caricamento dei dati ) e INSERT...SELECT
un'istruzione per spostare i dati inizialmente pensando che sarebbero stati minimamente registrati. Purtroppo ogni volta che provo è completamente registrato.
A questo punto sto pensando che la mia scommessa migliore potrebbe essere quella di spostare i dati usando un pacchetto SSIS. Sto cercando di evitare che dal momento che sto lavorando con 200 tabelle e tutto ciò che posso fare con lo script posso facilmente generare ed eseguire.
C'è qualcosa che mi manca nel mio piano generale e SSIS è la mia migliore scommessa per spostare i dati rapidamente e con un uso minimo del registro (problemi di spazio)?
Codice demo senza dati
-- Existing structure
USE [Audit]
GO
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
);
-- ~1.4 bill rows, ~20% in the last year
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
( [Modified] ASC )
GO
-- New DB & Code
USE Audit_New
GO
CREATE PARTITION FUNCTION ThirteenMonthPartFunction (datetime)
AS RANGE RIGHT FOR VALUES ('20150701', '20150801', '20150901', '20151001', '20151101', '20151201',
'20160101', '20160201', '20160301', '20160401', '20160501', '20160601',
'20160701')
CREATE PARTITION SCHEME ThirteenMonthPartScheme AS PARTITION ThirteenMonthPartFunction
ALL TO ( [PRIMARY] );
CREATE TABLE [dbo].[AuditTable](
[Col1] [bigint] NULL,
[Col2] [int] NULL,
[Col3] [int] NULL,
[Col4] [int] NULL,
[Col5] [int] NULL,
[Col6] [money] NULL,
[Modified] [datetime] NULL,
[ModifiedBy] [varchar](50) NULL,
[ModifiedType] [char](1) NULL
) ON ThirteenMonthPartScheme (Modified)
GO
CREATE CLUSTERED INDEX [AuditTable_Modified] ON [dbo].[AuditTable]
(
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
CREATE NONCLUSTERED INDEX [AuditTable_Col1_Col2_Col3_Col4_Modified] ON [dbo].[AuditTable]
(
[Col1] ASC,
[Col2] ASC,
[Col3] ASC,
[Col4] ASC,
[Modified] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON ThirteenMonthPartScheme (Modified)
GO
Sposta codice
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified