Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 表分区期间磁盘空间不足_Sql Server 2008_Partitioning - Fatal编程技术网

Sql server 2008 表分区期间磁盘空间不足

Sql server 2008 表分区期间磁盘空间不足,sql-server-2008,partitioning,Sql Server 2008,Partitioning,我正在尝试分割一个大表(160Gb)。它包含过去70天内生成的IIS日志中的数据。分区方案和函数将表拆分为相关的日期 每个文件组中有一个文件,每个文件中有一天的数据 表中当前没有聚集索引,在创建日志和从数据中提取ASP会话ID时,有2个非聚集索引 我遇到的问题是,当我尝试分配此表进行分区时,磁盘空间不足 是否有一种分批处理过程的方法 USE [Diagnostic_MB] GO BEGIN TRANSACTION CREATE CLUSTERED INDEX [ClusteredIndex_on

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

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

表中当前没有聚集索引,在创建日志和从数据中提取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

这就是最终占用我所有磁盘空间的代码。理想情况下,我希望能够将数据移出主文件组,而不是创建副本。这不是一个需要随时启动的数据库,因此也欢迎使用脱机解决方案…

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


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

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


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

如果您想知道为什么没有得到响应,应该继续问这个问题。我投票通过迁移到DBA来“结束”这个问题,但目前只有2票(需要5票)。