我试图分区一张大桌子( 160Gb )。它包含来自IIS logs
的数据,这些数据是在过去70天生成的。分区Scheme和function将表拆分为相关日期。
每个文件组中都有一个文件,每天有一天数据进入每个文件。
表上当前没有聚集索引,在创建日志的时候有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 :(得分:0)
简要说明:分区SQL Server时重建聚簇索引。要重建聚簇索引,它会对所有记录进行排序。在tempdb中进行排序。服务器需要表格大小的可用空间,或者表格可能是模式的x2大小(抱歉,现在不记得)。
快速修复:将一些数据(= 1个目标分区)复制到临时表中,在PF上创建该表的索引,将该位切换到目标表。一次移动2-3 GB应该不是问题。
答案 1 :(得分:0)
Stoleg已经有了一个好主意。这是另一个:删除非聚集索引预重建(因为CI重建也可能会重建它们,具体取决于您的情况)并对所有操作使用单独的事务(正在运行的事务可防止删除已删除的alloc单元并释放空间) )。
还有一个更高级的技巧:在分区键和CI键上构建NCI。这样,SQL Server可能会使用该NCI来构建分区CI。然后,它不需要再次对数据集进行排序,因为NCI提供排序顺序。我实际上已经在野外看到了这个计划的形状。如果SQL Server可以将NCI与密钥查找结合使用,则SQL Server并不总是对整个表进行排序。根据其启发式方法,查询计划有时会更便宜。