Görev
Bir grup büyük masadan 13 aylık bir dönem dışında hepsini arşivleyin. Arşivlenen veriler başka bir veritabanında saklanmalıdır.
- Veritabanı basit kurtarma modunda
- Tablolar 50 mil ile birkaç milyar arasındadır ve bazı durumlarda yüzlerce gb alır.
- Tablolar şu anda bölümlenmemiş
- Her tablonun gittikçe artan bir tarih sütununda kümelenmiş bir dizini vardır
- Her tablo ayrıca, kümelenmemiş bir dizine sahiptir
- Tablolardaki tüm veri değişiklikleri eklerdir
- Amaç, birincil veritabanının çalışmama süresini en aza indirmektir.
- Sunucu 2008 R2 Kuruluşudur
"Arşiv" masası yaklaşık 1.1 milyar sıraya, "canlı" tablo ise yaklaşık 400 milyon olacaktır. Açıkçası, arşiv masası zamanla artacaktır, ancak canlı masanın da oldukça hızlı bir şekilde artmasını bekliyorum. Önümüzdeki birkaç yıl içinde en az% 50 deyin.
Azure veri tabanları hakkında düşünmüştüm ama maalesef 2008 R2'deyiz ve bir süre orada kalacağız.
Mevcut Plan
- Yeni bir veritabanı oluştur
- Yeni veritabanında aya göre (değiştirilmiş tarihi kullanarak) bölümlenmiş yeni tablolar oluşturun.
- En son 12-13 aylık verileri bölümlenmiş tablolara taşıyın.
- İki veritabanının takas ismini değiştir
- Taşınan verileri şimdi "arşiv" veritabanından silin.
- "Arşiv" veritabanındaki tabloların her birini bölümlere ayırın.
- Gelecekte verileri arşivlemek için bölüm takaslarını kullanın.
- Arşivlenecek verileri yerinden çıkarmak, o masayı arşiv veritabanına kopyalamak ve sonra arşiv masasına değiştirmek zorunda kalacağımın farkındayım. Bu kabul edilebilir.
Sorun: Verileri ilk bölümlenmiş tablolara taşımaya çalışıyorum (aslında hala üzerinde bir konsept kanıtı yapıyorum). TF 610 ( Veri Yükleme Performansı Kılavuzu'na göre ) ve INSERT...SELECT
verileri başlangıçta en az günlüğe kaydedileceğini düşünerek taşımak için bir ifade kullanmaya çalışıyorum . Ne yazık ki her denediğimde tamamen giriş yapıyor.
Bu noktada en iyisi, bir SSIS paketi kullanarak verileri taşımak olabilir. Bundan kaçınmaya çalışıyorum çünkü 200 tablo ile çalışıyorum ve senaryo ile yapabildiğim her şeyi kolayca oluşturabiliyorum ve çalıştırabiliyorum.
Genel planımda eksik olan bir şey var mı ve SSIS, verileri hızlı bir şekilde ve günlüğün en az kullanımıyla (alan endişeleriyle) taşımak için en iyi bahisüm mü?
Veri içermeyen demo kodu
-- 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
Kodu taşı
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified