Sql server如何插入百万行

时间:2015-11-06 14:47:45

标签: sql sql-server performance sql-insert

我在sql server中有一个包含300万行的source_table。 主键是内置的sql uniqueidentifier。

我想将所有300万行复制到4个表中:

Table1包含一些主要信息,例如uniqueidentifierbook_titlebook_authorbook_priceTable2Table3Table4将列出所有不同的列,但它们将具有与uniqueidentifier相同的Table1主键,并且该主键也将是外键到Table1的uniqueidentifier主键。

source_table复制需要很长时间,因为Table1Table2Table3Table4中的每一行都有5000万行。它很慢,我想提高性能。我的代码如下。有没有人有想法提高性能甚至一点点?每天都会填充source_table,我必须重新插入Table1Table2Table3Table4

感谢您的建议。

insert into Table1 values (UID, book_title, book_author, book_price)
select values (@UID, @title, @author, @price)
from source_table

insert into Table2 values (UID, col2, col3, col4)
select values (@UID, @col2value, @col3value, @col4value)
from source_table

insert into Table3 values (UID, col2, col3, col4)
select values (@UID, @col2value, @col3value, @col4value)
from source_table

1 个答案:

答案 0 :(得分:1)

尝试使用INSERT INTO ... SELECT以最小日志记录批量导入数据(请参阅MSDN article

此语句的最小日志记录具有以下要求:

  • 数据库的恢复模型设置为简单或批量记录。
  • 目标表为空或是非空堆。
  • 目标表不用于复制。
  • 为目标表指定了TABLOCK提示。

    -- Temporarily set the recovery model to BULK_LOGGED.
    ALTER DATABASE MyDB
    SET RECOVERY BULK_LOGGED;
    GO
    -- You May have to drop the clustered index here
    
    INSERT INTO INTO Table1 WITH (TABLOCK)
         (UID, book_title, book_author, book_price)
    SELECT UID, title, author, price)
    FROM source_table
    
    -- RECREATE CLUSTERED INDEX HERE
    
    -- Reset the recovery model.
    ALTER DATABASE MyDB
    SET RECOVERY FULL;
    GO
    

    ***现在做完全备份