仕事
大きなテーブルのグループから、13か月のローリング期間を除くすべてをアーカイブします。アーカイブされたデータは別のデータベースに保存する必要があります。
- データベースは単純復旧モードです
- テーブルは50ミリ行から数十億行で、場合によってはそれぞれ数百GBを占有します。
- テーブルは現在パーティション化されていません
- 各テーブルには、増え続ける日付列に1つのクラスター化インデックスがあります
- 各テーブルには、さらに1つの非クラスター化インデックスがあります
- テーブルに対するすべてのデータ変更は挿入です
- 目標は、プライマリデータベースのダウンタイムを最小限に抑えることです。
- サーバーは2008 R2 Enterpriseです
「アーカイブ」テーブルには約11億行、「ライブ」テーブルには約4億行が含まれます。明らかに、アーカイブテーブルは時間とともに増加しますが、ライブテーブルも合理的に急速に増加することを期待しています。少なくとも次の数年で50%と言います。
Azureストレッチデータベースについて考えていましたが、残念ながら2008 R2にあり、しばらくそこに留まる可能性があります。
現在の計画
- 新しいデータベースを作成する
- 新しいデータベースに(変更日を使用して)月ごとにパーティション分割された新しいテーブルを作成します。
- 直近の12〜13か月分のデータをパーティションテーブルに移動します。
- 2つのデータベースの名前変更スワップを行う
- 移動したデータを現在の「アーカイブ」データベースから削除します。
- 「アーカイブ」データベースの各テーブルをパーティション分割します。
- パーティションスワップを使用して、将来データをアーカイブします。
- アーカイブするデータをスワップアウトし、そのテーブルをアーカイブデータベースにコピーし、それをアーカイブテーブルにスワップする必要があることを理解しています。これは許容範囲です。
問題: データを初期パーティションテーブルに移動しようとしています(実際、まだデータの概念実証を行っています)。私はTF 610(データロードパフォーマンスガイドに従って)とINSERT...SELECT
ステートメントを使用して、データを最小限に記録されると最初に考えて移動しようとしています。残念ながら、私が試すたびに完全にログに記録されます。
この時点で、SSISパッケージを使用してデータを移動することが最善の策だと考えています。200個のテーブルと、スクリプトでできることはすべて簡単に生成して実行できるため、これを回避しようとしています。
私の一般的な計画で不足しているものはありますか?SSISは、ログを最小限に抑えてデータをすばやく移動するための最善の策です(スペースの問題)?
データなしのデモコード
-- 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
コードを移動
USE Audit_New
GO
DBCC TRACEON(610);
INSERT INTO AuditTable
SELECT * FROM Audit.dbo.AuditTable
WHERE Modified >= '6/1/2015'
ORDER BY Modified