Sql server 考虑到性能,如何在循环中将数据从一个表插入到另一个表中?

Sql server 考虑到性能,如何在循环中将数据从一个表插入到另一个表中?,sql-server,insert,bulkinsert,database-performance,Sql Server,Insert,Bulkinsert,Database Performance,我需要在一个循环中从一个表向另一个表插入数据,每个循环运行中有10k行 我想试试这个,因为我的插入***select from花费了很多时间,因为源表有数百万条记录 使用这种方法会提高性能吗?您可以尝试批量插入,看看是否有任何性能改进。以下是示例代码: DECLARE @Count INT DECLARE @Start INT SET @Start = 1 SELECT @Count = COUNT(*) FROM TableName1 WHILE @Start<=@Count BEG

我需要在一个循环中从一个表向另一个表插入数据,每个循环运行中有10k行

我想试试这个,因为我的插入***select from花费了很多时间,因为源表有数百万条记录


使用这种方法会提高性能吗?

您可以尝试批量插入,看看是否有任何性能改进。以下是示例代码:

DECLARE @Count INT
DECLARE @Start INT

SET @Start = 1
SELECT @Count = COUNT(*) FROM TableName1

WHILE @Start<=@Count
BEGIN
    WITH cte
    AS
    (
        SELECT Col1, Col2, Col3,ROW_NUMBER() OVER (ORDER BY Col1) AS 'RowNum' FROM TableName1
    )

    INSERT INTO TableName2 SELECT Col1, Col2, Col3 FROM cte WHERE RowNum >= @Start AND RowNum < @Start+10000

    SET @Start += 10000

    WAITFOR DELAY '00:00:10'
END

这里10000是批量大小,您可以根据自己的方便更改此值。

您可以尝试批量插入,看看是否有任何性能改进。以下是示例代码:

DECLARE @Count INT
DECLARE @Start INT

SET @Start = 1
SELECT @Count = COUNT(*) FROM TableName1

WHILE @Start<=@Count
BEGIN
    WITH cte
    AS
    (
        SELECT Col1, Col2, Col3,ROW_NUMBER() OVER (ORDER BY Col1) AS 'RowNum' FROM TableName1
    )

    INSERT INTO TableName2 SELECT Col1, Col2, Col3 FROM cte WHERE RowNum >= @Start AND RowNum < @Start+10000

    SET @Start += 10000

    WAITFOR DELAY '00:00:10'
END

这里10000是批量大小,您可以根据自己的方便更改此值。

您考虑过索引吗?你想复制一下这张桌子吗?目标表是否具有相同的索引、约束等。?你使用的是什么版本的SQL Server?@Chucky我怀疑索引是问题所在——毕竟OP读取了整个表数百万行。这也是一个SQL Server问题-为什么要链接到MySQL文档?在什么时候插入。。复制数据时,我的问题是源表是否已锁定如果是,则会对性能产生很大影响..您考虑过索引吗?你想复制一下这张桌子吗?目标表是否具有相同的索引、约束等。?你使用的是什么版本的SQL Server?@Chucky我怀疑索引是问题所在——毕竟OP读取了整个表数百万行。这也是一个SQL Server问题-为什么要链接到MySQL文档?在什么时候插入。。复制数据时,我的问题是源表是否已锁定如果是,则会对性能产生很大影响。这将是一项开销。。这会减慢进程。嗨,如果我无法获得“@count”,我该怎么办?这是一个非常有用的代码段,为什么会这样@count只不过是您试图查询的表中记录的总数。这将是一项开销。。这会减慢进程。嗨,如果我无法获得“@count”,我该怎么办?这是一个非常有用的代码段,为什么会这样@count是您试图查询的表中记录的总数。