我有一个非常大的SQL Server表(2.2亿条记录),大小为233GB。我需要将此表导出到一个平面文件中,然后通过Putty将其发送到另一台服务器,Putty将直接将该表插入数据仓库。
此数据仓库有一个特定的架构,该如何加载数据(特定的数据类型和每列的长度)。
首先,我需要通过更改SQL Server中列的数据类型和数据长度来进行一些验证。我使用alter table
来更改数据类型和数据长度,但最终出现错误。因此,我尝试在应该坚持数据仓库模式的那些列上使用SUBSTRING
和CAST
函数的同时,将该表插入到新表中。
由于事务日志文件驱动器和TempDB驱动器中的空间限制,这是不可能的。我现在完全没有希望了。任何替代解决方案来完成此任务将不胜感激。
答案 0 :(得分:1)
我还在有限的空间上处理一张大约有这种大小的大桌子。有几种解决方法。但是您必须要小心,您可能会遇到错误,因为您用完了物理空间,这有可能导致SQL崩溃。执行这些操作时,请密切注意磁盘的可用空间,日志文件的大小以及其增长速度。取消所有可能导致磁盘用尽的操作(最好在您经过无归还点之前,因为取消过程也需要时间)。我首先要检查的是,您的数据库恢复模型设置为“完整”还是“简单”?设置为“简单”有助于减少日志记录并减少宝贵的临时空间。
当然,当您处理非常有限的空间时,需要注意数据库和日志文件的大小。我知道通常要皱眉,但有时这是不可避免的。在尝试下一个解决方案时,请尝试使用DBCC SHRINKFILE()将数据库和日志文件保持在尽可能低的水平。确保正确计算数据库实际使用了多少空间,并留出一点填充空间。
--Check free space in a file
USE DMS_DataCompare;
SELECT name ,size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 AS AvailableSpaceInMB
FROM sys.database_files;
USE tempdb
DBCC SHRINKFILE (tempdev,1)
DBCC SHRINKFILE (templog,1)
USE Master;
DBCC SHRINKFILE (N'MASTER',10000)
DBCC SHRINKFILE (N'MASTER_log',NOTRUNCATE)
一种处理此问题的方法是逐列。您可以删除先前数据表的任何部分吗?如果是这样,您可以添加与要迁移到的架构具有相同规格的列,然后使用UPDATE将数据从旧列复制到新列,然后删除旧列,然后执行收缩文件。冲洗并重复。
要尝试的另一件事,是否有任何数据列包含不需要的数据?您可以将这些内容清空为空,执行收缩文件,这将恢复一些宝贵的移动空间。
另一种方式是发表评论者的内容,设置视图以强制数据通过所需的数据类型和大小。我认为您应该先尝试一下,因为这会使整个过程变为只读状态,这样就不会弄乱文件大小和日志记录了。您还可以编写一个过程以使其类似于视图,该过程接受两个参数:start和stop,这两个参数可以用来指定要拉取的范围。然后可以在导出步骤中使用它。
并按照user1443098的说明,成批导出,而不是作为一个过程而是作为一个简单的脚本导出。但是,这可能会让人很痛苦,尤其是尝试导出到平面文件中时,因为您可能会很快迷失在哪个文件中的确切范围内,或者根据文件所在的范围来命名。如果您的数据当前处于活动状态并且正在更改,则此选项可能无用。
另一种选择是备份数据库并将其还原到具有该空间的计算机上。通过备份压缩后,数据库备份可以是其正常大小的1/10(如果您有支持此功能的SQL版本)。
另一个可能是以上两个的组合。创建具有目的地规格的表,然后编写脚本以从旧表到新表的批处理插入。每一批之后,从旧表中删除相同的范围,并执行收缩文件。确保首先验证所有成功复制到新表中的数据!不过,此过程可能会非常漫长,因为涉及的每个步骤都将花费时间。
希望这会有所帮助,祝您好运!
答案 1 :(得分:0)
批量插入新表,一次插入1000,000行。这将帮助您控制tempdb和日志使用情况