2012-11-12 40 views
1

期间磁盘空间用完的我试图分区之前一个大表(160Gb的)。它包含IIS logs的数据,这些数据是通过过去70天生成的。分区方案和功能将表格拆分成相关日期。表分区

每个文件组中有一个文件,一个数据会存入每个文件。

有在桌子上目前没有聚集索引,有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...

+0

为防万一你想知道你为什么没有得到回应,应该在http://dba.stackexchange.com/上提出这个问题。我已投票通过迁移到DBA来“关闭”这个问题,但目前只有2票(需要5个)。 – freefaller

回答

0

简述:分区SQL Server时,重建聚簇索引。要重建聚集索引,它将排序所有记录。排序发生在tempdb中。服务器需要表的大小的可用空间或可能是x2大小的表依赖于模式(对不起,现在不记得)。

快速修复:一些数据(= 1个目标分区)复制到临时表,对PF该表创建索引,该位切换到目标表。一次移动2-3 GB应该不成问题。

0

斯托莱格已经有了一个好主意。下面是另一个:删除非聚集索引预重建(因为CI重建也可能重建它们,取决于您的情况),并对所有操作使用单独的事务(正在运行的事务防止已放弃的alloc单元被释放并释放空间)。

还有一个更高级的技巧:在你的分区键和CI键上构建一个NCI。这样SQL Server可能会使用该NCI来构建分区配置项。然后它不需要再次对数据集进行排序,因为NCI提供了排序顺序。我实际上在野外看到了这种平面形状。如果SQL Server可以将NCI与键查找结合使用,则它并不总是对整个表进行排序。有时根据其启发式查找计划会更便宜。