我在sql server中有一个包含300万行的source_table。 主键是内置的sql uniqueidentifier。
我想将所有300万行复制到4个表中:
Table1
包含一些主要信息,例如uniqueidentifier
,book_title
,book_author
,book_price
。 Table2
,Table3
和Table4
将列出所有不同的列,但它们将具有与uniqueidentifier
相同的Table1
主键,并且该主键也将是外键到Table1的uniqueidentifier
主键。
从source_table
复制需要很长时间,因为Table1
,Table2
,Table3
和Table4
中的每一行都有5000万行。它很慢,我想提高性能。我的代码如下。有没有人有想法提高性能甚至一点点?每天都会填充source_table,我必须重新插入Table1
,Table2
,Table3
和Table4
。
感谢您的建议。
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
答案 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
***现在做完全备份