1

大きなテーブル ( 160Gb )を分割しようとしています。過去 70 日間IIS logsに生成されたデータが含まれています。partition スキームと関数は、テーブルを関連する日に分割します。

各ファイル グループには 1 つのファイルがあり、各ファイルには 1 日のデータが入ります。

現在、テーブルにはクラスター化されたインデックスはありません。ログが作成された頃に 2 つの非クラスター化インデックスがあり、データから取得された ASP セッション ID があります。

私が抱えている問題は、このテーブルをパーティション分割するように割り当てようとすると、ディスク容量が不足することです。

プロセスをバッチ処理する方法はありますか?

USE [Diagnostic_MB]
GO
BEGIN TRANSACTION
CREATE CLUSTERED INDEX [ClusteredIndex_on_Scheme70Day_634883295513235207] ON [dbo].[IISLog] 
(
    [SentUTCDateTime]
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [Scheme70Day]([SentUTCDateTime])


DROP INDEX [ClusteredIndex_on_Scheme70Day_634883295513235207] ON [dbo].[IISLog] WITH ( ONLINE = OFF )



CREATE NONCLUSTERED INDEX [ASPSession] ON [dbo].[IISLog] 
(
    [ASPSessionID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [Scheme70Day]([SentUTCDateTime])
CREATE NONCLUSTERED INDEX [IX_Time] ON [dbo].[IISLog] 
(
    [SentUTCDateTime] ASC
)
INCLUDE ( [csHost],
[scStatus],
[timeTaken]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [Scheme70Day]([SentUTCDateTime])


COMMIT TRANSACTION

これは、最終的にすべてのディスク スペースを消費するコードです。理想的には、コピーを作成するのではなく、プライマリ ファイル グループからデータを移動できるようにしたいと考えています。これは常に稼働している必要があるデータベースではないため、offline solutions are also welcome...

4

2 に答える 2

0

Stoleg はすでに良い考えを持っていました。もう 1 つ: 再構築前に非クラスター化インデックスを削除し (状況によっては、CI 再構築でも再構築される可能性があるため)、すべての操作に個別のトランザクションを使用します (実行中のトランザクションにより、削除された割り当て単位が割り当て解除され、スペースが解放されるのを防ぎます)。 )。

より高度なトリックもあります。パーティショニング キーと CI キーで NCI を構築します。そうすれば、SQL Server はその NCI を使用してパーティション化された CI を構築する可能性があります。NCI がソート順を提供するため、データ セットを再度ソートする必要はありません。私は実際にこの計画の形を実際に見てきました。NCI をキー検索と組み合わせて使用​​できる場合、SQL Server は常にテーブル全体をソートするとは限りません。ルックアップ プランは、そのヒューリスティックに従って安価になる場合があります。

于 2013-05-31T22:38:39.983 に答える