我有一个用SQL编写的表,如下所示

PersonDetails
{
 ID, // identity column
 Age int,
 FirstName varchar,
 LastName varchar,
 CreatedDateTime DateTime,
}

这个表目前大约有1亿行,我需要将数据增加到大约10亿行,以测试在这个表上创建一些索引所需的时间. 我可以使用同一个表中的数据一次又一次地插入行. 实现这一目标的最快方法是什么?

我在SQL中创建了一个简单的WHILE循环,如下所示

Declare @maxrows bigint = 900000000,
        @currentrows bigint,
        @batchsize bigint = 10000000;
        
select @currentrows = count(*) from [dbo].[PersonDetails] with(nolock)

while @currentrows < @maxrows
    begin
        insert into [dbo].[PersonDetails]
        select top(@batchsize) 
               [Age]
              ,[FirstName]
              ,[LastName]
              ,[CreatedDateTime]
        from [dbo].[PersonDetails]
        
        select @currentrows = count(*) from [dbo].[PersonDetails] with(nolock)
    end

但问题是,此查询在插入一些数据后显示以下错误. The transaction log for database 'DBNAME' is full due to 'LOG_BACKUP'.

我可以在每个插入中添加一些延迟,或者减少批大小.

在这里前进的最好方式是什么?

推荐答案

如果此数据库位于测试环境中,请将恢复模式更改为SIMPLE:

enter image description here

如果没有,我猜您无法更改数据库设置,我会建议您在小批量上执行操作并提交每次迭代.它将如下所示:

while @currentrows < @maxrows
begin

    BEGIN TRY;
            
        BEGIN TRANSACTION;

            insert into [dbo].[PersonDetails]
            select top(@batchsize) 
                   [Age]
                  ,[FirstName]
                  ,[LastName]
                  ,[CreatedDateTime]
            from [dbo].[PersonDetails]
        
        COMMIT TRANSACTION;

        select @currentrows = count(*) from [dbo].[PersonDetails] with(nolock)


    END TRY
    BEGIN CATCH

        IF @@TRANCOUNT > 0
        BEGIN;
            ROLLBACK TRANSACTION;
        END;

        THROW;

    END CATCH;

    -- WAITFOR DELAY '00:00:01';

end

您也可以使用Waitfor Delay,以便分配给许多资源并阻止其他查询.

Sql相关问答推荐

对非RUST源代码字符串使用`stringify!`,例如SQL查询

基于多参数的SQL Server条件过滤

在迁移到.NET8后,使用Array.Containers的F#查询表达式失败

Select 列组(按同一表格中的另一列分组)Laravel 10

SQL Athena/prest判断值是否在嵌套的json数组中

Oracle PL/SQL:解决DBMS输出大小限制的问题

仅在日期相隔时递增(Oracle SQL)

从JSON值数组创建扁平数组Athena

使用多个WITH子查询的替代方法

其中使用表名作为;行值;记录?

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

使用 SQL 将列添加到 Access 数据库时出错

使用多个数据库调用重载 CQRS 模式

计算 ID 满足条件的次数

如何在第二个 INSERT 中使用第一个 INSERT 自动生成的 ID

SQL:考虑合并分支计算分支的增长百分比

基于字符串的SQL查询

在给定的日期范围内填写缺失的日期

如果 SQL 中不存在数据,如何根据某个 ID 为所有日期添加前一行

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列