Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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)_Sql_Sql Server - Fatal编程技术网

将大表插入新表(SQL)

将大表插入新表(SQL),sql,sql-server,Sql,Sql Server,我有一个非常大的SQL Server表(2.2亿条记录),大小为233GB。我需要将此表导出到平面文件中,并通过Putty将其发送到另一台服务器,Putty将直接将此表插入数据仓库 该数据仓库有一个特定的模式,即如何加载数据(每个列的特定数据类型和长度) 首先,我需要通过更改SQLServer中列的数据类型和数据长度来进行一些验证。我使用altertable来更改数据类型和数据长度,但最终得到了错误。因此,我尝试将该表插入到一个新表中,同时对那些应该坚持数据仓库模式的列使用SUBSTRING和C

我有一个非常大的SQL Server表(2.2亿条记录),大小为233GB。我需要将此表导出到平面文件中,并通过Putty将其发送到另一台服务器,Putty将直接将此表插入数据仓库

该数据仓库有一个特定的模式,即如何加载数据(每个列的特定数据类型和长度)

首先,我需要通过更改SQLServer中列的数据类型和数据长度来进行一些验证。我使用
altertable
来更改数据类型和数据长度,但最终得到了错误。因此,我尝试将该表插入到一个新表中,同时对那些应该坚持数据仓库模式的列使用
SUBSTRING
CAST
函数


这是不可能的,因为事务日志文件驱动器和TempDB驱动器中存在空间限制。我现在完全没有希望了。如果您有任何其他解决方案来完成这项任务,我们将不胜感激

批量插入到新表中,例如一次插入1000000行。这将有助于您控制tempdb和日志的使用量

我还可以在有限的空间中处理一个如此大的表。有几种方法可以解决这个问题。但您必须小心,您可能会因为耗尽了物理空间而出错,这可能会导致SQL崩溃。执行这些操作时,请密切关注磁盘可用空间和日志文件大小及其增长速度。取消任何可能导致磁盘最大化的操作(最好在您超过停止点之前,因为取消过程也需要时间)。首先我要检查的是,您的DB恢复模型设置为完整还是简单?设置为Simple有助于减少日志记录和使用宝贵的临时空间

在处理非常有限的空间时,当然需要注意数据库和日志文件的大小。我知道我将要提出的建议通常是不赞成的,但有时是不可避免的。尝试下一个解决方案时,请尝试使用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)
解决这个问题的一种方法是逐列操作。您可以删除上一个数据表的任何部分吗?如果是这样,您可以添加一个与要迁移到的架构规格相同的列,然后使用更新将数据从旧列复制到新列,然后删除旧列,然后执行收缩文件。冲洗并重复

另一件要尝试的事情是,是否有任何数据列包含您不需要的数据?您可以将这些设置为空,执行一个收缩文件,这样可以恢复一些有价值的移动空间

另一种方法是,根据评论者发布的内容,设置一个视图,强制数据通过所需的数据类型和大小。我认为您应该先尝试一下,因为它使整个过程成为只读的,这样您就不会弄乱文件大小和日志记录。您还可以编写一个过程,使其工作方式与视图类似,该过程包含两个参数“开始”和“停止”,可用于指定要拉伸的范围。然后可以在导出步骤中使用此选项

正如user1443098所发布的,批量导出,不是作为一个过程,而是作为一个简单的脚本。但这可能是一个很难跟踪的问题,尤其是在尝试以平面文件的形式导出时,因为您可能会很快迷失在哪个文件包含的确切范围内,可能会根据它包含的范围命名您的文件。如果您的数据当前处于活动状态且正在更改中,则此选项可能无效

另一种选择是备份数据库,并将其恢复到有空间的机器上。通过备份压缩后,DB备份的大小可以是正常大小的1/10(如果您有支持此功能的SQL版本)

另一种是上述两种方法的组合。创建一个带有目标规格的表,然后编写一个脚本,将旧表批量插入到新表中。在每个批处理之后,从旧表中删除相同的范围,并创建一个收缩文件。确保首先验证所有数据是否成功复制到新表中!但这一过程可能非常漫长,因为每一步都需要时间


希望这有帮助,祝你好运

可以在数据库上创建视图。如果是,则转换视图中的数据,并将数据从视图而不是表复制到平面文件中。@GrzegorzGrabek从未尝试过或想到过。现在让我试试,我也试过了。即使要分割数据,也需要TempDB驱动器中更多的空间。不要在SQL中分割数据。在用于插入数据的程序中,一次读取(平面文件)某些部分(例如100.000行),插入这些部分,然后提交。然后做接下来的100000行等等,直到doneI忘记提到这一点。我不是从平面文件导入这个大表。这个表是通过连接SQL中的另外两个表创建的。那么您的问题是在这一步?“我需要将这个表导出到一个平面文件中”,然后您可以使用运行在不同服务器上的SSI来完成这项工作(以免耗尽您的tempdb),或者只需获得更多tempdb空间。哦,这是很多信息。谢谢你,伙计。我会告诉你哪一个适合我。