如何在SQL中快速复制行

时间:2009-10-15 00:45:02

标签: sql

编辑:我正在运行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]

这个过程非常缓慢。并且我必须重复发出查询次数是否有更好的方法来执行此操作?

5 个答案:

答案 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