1

我正在尝试对一个大表(160Gb)进行分区。它包含过去 70 天内IIS logs生成的数据。分区方案和函数将表拆分为相关日期。

每个文件组中有一个文件,每个文件中有 1 天的数据。

表上当前没有聚集索引,在创建日志和从数据中提取的 ASP 会话 ID 前后有 2 个非聚集索引。

我遇到的问题是,当我尝试将此表分配为分区时,我的磁盘空间不足。

有没有办法批处理这个过程?

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

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

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

于 2013-05-31T22:38:39.983 回答
0

简而言之:分区时 SQL Server 会重建聚集索引。要重建聚集索引,它会对所有记录进行排序。排序发生在 tempdb 中。服务器需要表格大小的可用空间,或者可能是 x2 大小的表格,具体取决于模式(抱歉,现在不记得了)。

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

于 2013-05-31T14:33:31.237 回答