编辑:我正在运行SQL Server 2008
我桌上有大约400,000行。我想复制这些行,直到我的表有160万行左右。我一直在使用这样的声明:
INSERT INTO [DB].[dbo].[Sales]
([TotalCost]
,[SalesAmount]
,[ETLLoadID]
,[LoadDate]
,[UpdateDate])
SELECT [TotalCost]
,[SalesAmount]
,[ETLLoadID]
,[LoadDate]
,[UpdateDate]
FROM [DB].[dbo].[Sales]
这个过程非常缓慢。并且我必须重复发出查询次数是否有更好的方法来执行此操作?
答案 0 :(得分:3)
要执行此操作,您需要禁用所有索引和约束(包括外键),然后运行一系列:
INSERT INTO mytable
SELECT fields FROM mytable
如果您需要指定ID,请选择一些数字,如80,000,000,并包含在SELECT列表ID+80000000
中。根据需要运行多次(不超过10次,因为每次应该加倍)。
此外,不在交易中运行。在如此庞大的数据集上这样做的开销将是巨大的。无论如何,您可能会耗尽资源(回滚段或数据库使用的任何内容)。
然后重新启用所有约束和索引。这将花费很长时间,但总的来说,它比在每行上添加索引和检查约束更快。
答案 1 :(得分:1)
每次运行该命令时,它将加倍表的大小,你只需要运行它大约9次(400,000 * 2 9 = 204,800,000 )。是的,可能需要一段时间,因为复制那么多数据需要一些时间。
答案 2 :(得分:1)
插入的速度取决于许多事情......物理磁盘速度,索引等。我建议从表中删除所有索引并在完成后添加它们。如果表格被严格索引,那么这应该会有所帮助。
您应该能够在循环中重复运行该查询,直到达到所需的行数。每次运行它都会使数据加倍,所以最终会得到:
400,000
800,000
1,600,000
3,200,000
6,400,000
12,800,000
25,600,000
51,200,000
102,400,000
204,800,000
九次执行后。
答案 3 :(得分:0)
您没有说明您的SQL数据库,但大多数都有一个批量加载工具来处理这种情况。检查文档。如果必须使用INSERT,请先从表中删除所有索引,然后在插入数据后重新应用它们;这通常比插入过程中的索引要快得多。
答案 4 :(得分:0)
这可能还需要一段时间才能运行...您可能希望在创建数据时关闭日志记录。
INSERT INTO [DB].[dbo].[Sales] (
[TotalCost] ,[SalesAmount] ,[ETLLoadID]
,[LoadDate] ,[UpdateDate]
)
SELECT s.[TotalCost] ,s.[SalesAmount] ,s.[ETLLoadID]
,s.[LoadDate] ,s.[UpdateDate]
FROM [DB].[dbo].[Sales] s (NOLOCK)
CROSS JOIN (SELECT TOP 400 totalcost FROM [DB].[dbo].[Sales] (NOLOCK)) o