Tugas
Arsipkan semua kecuali periode bergulir 13 bulan dari sekelompok tabel besar. Data yang diarsipkan harus disimpan dalam database lain.
- Basis data dalam mode pemulihan sederhana
- Tabelnya adalah 50 mil baris hingga beberapa miliar dan dalam beberapa kasus masing-masing memakan ratusan gb.
- Tabel saat ini tidak dipartisi
- Setiap tabel memiliki satu indeks berkerumun di kolom tanggal yang semakin meningkat
- Setiap tabel juga memiliki satu indeks non-cluster
- Semua perubahan data pada tabel adalah sisipan
- Tujuannya adalah untuk meminimalkan downtime dari basis data primer.
- Server adalah 2008 R2 Enterprise
Tabel "arsip" akan memiliki sekitar 1,1 miliar baris, tabel "langsung" sekitar 400 juta. Jelas tabel arsip akan meningkat seiring waktu, tetapi saya berharap tabel langsung akan meningkat dengan cukup cepat juga. Katakan 50% setidaknya dalam beberapa tahun ke depan.
Saya telah memikirkan tentang peregangan basis data Azure tetapi sayangnya kami berada di 2008 R2 dan cenderung tinggal di sana untuk sementara waktu.
Rencana saat ini
- Buat database baru
- Buat tabel baru yang dipartisi berdasarkan bulan (menggunakan tanggal yang dimodifikasi) di database baru.
- Pindahkan data 12-13 bulan terakhir ke tabel dipartisi.
- Lakukan pergantian nama dari dua basis data
- Hapus data yang dipindahkan dari database "arsip" sekarang.
- Partisi setiap tabel dalam database "arsip".
- Gunakan swap partisi untuk mengarsipkan data di masa mendatang.
- Saya menyadari bahwa saya harus menukar data yang akan diarsipkan, menyalin tabel itu ke database arsip, dan kemudian menukarnya ke tabel arsip. Ini bisa diterima.
Masalah: Saya mencoba untuk memindahkan data ke tabel partisi awal (sebenarnya saya masih melakukan pembuktian konsep di atasnya). Saya mencoba menggunakan TF 610 (sesuai dengan Panduan Kinerja Pemuatan Data ) dan INSERT...SELECT
pernyataan untuk memindahkan data yang awalnya berpikir itu akan dicatat secara minimal. Sayangnya setiap kali saya mencoba sepenuhnya login.
Pada titik ini saya pikir taruhan terbaik saya adalah memindahkan data menggunakan paket SSIS. Saya mencoba untuk menghindari itu karena saya bekerja dengan 200 tabel dan apa pun yang dapat saya lakukan dengan skrip saya dapat dengan mudah menghasilkan dan menjalankan.
Apakah ada sesuatu yang saya lewatkan dalam rencana umum saya, dan apakah SSIS taruhan terbaik saya untuk memindahkan data dengan cepat dan dengan penggunaan log yang minimal (masalah ruang)?
Kode demo tanpa data
-- 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
Pindahkan kode
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified