SQL Server在使用INSERT INTO循环时加速
SQL WHILE循环使用Insert Into时速度较慢。 有没有办法加快查询速度 我想插入500000行。如果在每10000行之后有一个提交,它会更快吗 例如: 将行从DB1插入到DB2,并从DB2获取主自动删除密钥id到DB1SQL Server在使用INSERT INTO循环时加速,sql,sql-server,loops,tsql,insert-into,Sql,Sql Server,Loops,Tsql,Insert Into,SQL WHILE循环使用Insert Into时速度较慢。 有没有办法加快查询速度 我想插入500000行。如果在每10000行之后有一个提交,它会更快吗 例如: 将行从DB1插入到DB2,并从DB2获取主自动删除密钥id到DB1 CREATE TABLE #TempTable ( ROWID int identity(1,1) primary key, Comp_Key_1 NVARCHAR(20), Comp_Key_2 NVARCH
CREATE TABLE #TempTable
(
ROWID int identity(1,1) primary key,
Comp_Key_1 NVARCHAR(20),
Comp_Key_2 NVARCHAR(256),
Comp_Key_3 NVARCHAR(256)
)
INSERT INTO #TempTable (Comp_Key_1, Comp_Key_2, Comp_Key_3)
SELECT Comp_Key_1, Comp_Key_2, Comp_Key_3 FROM [DB1].[dbo].FILES
DECLARE @MAXID INT, @Counter INT, @Comp_Key_1 NCHAR(20), @Comp_Key_2 nvarchar(256), @Comp_Key_3 nvarchar(256), @id_current int,;
SET @COUNTER = 1
SELECT @MAXID = COUNT(*) FROM #Temp
WHILE (@COUNTER <= @MAXID)
BEGIN
set @Comp_Key_1= (select Comp_Key_1_doc from #Temp where ROWID= @COUNTER)
set @Comp_Key_2= (select Comp_Key_2_doc from #Temp where ROWID= @COUNTER)
set @Comp_Key_3= (select Comp_Key_3_doc from #Temp where ROWID= @COUNTER)
INSERT INTO [DB2].[dbo].[ADDRESS] (STREET,STREET_FROM,STREET_TO)
SELECT STREET,STREET_FROM,STREET_TO
FROM [DB1].[dbo].[ADDRESS]
WHERE [DB1].[dbo].[ADDRESS].Comp_Key_1= @Comp_Key_1
and [DB1].[dbo].[ADDRESS].Comp_Key_2=@Comp_Key_2
and [DB1].[dbo].[ADDRESS].Comp_Key_3=@Comp_Key_3;
set @id_current = IDENT_CURRENT('[DB2].[dbo].[ADDRESS]')
update [DB1].[dbo].[ADDRESS]
set id=@id_current
where @Comp_Key_1=[ADDRESS].Comp_Key_1
and @Comp_Key_2=[ADDRESS].Comp_Key_2
and @Comp_Key_3=[ADDRESS].Comp_Key_3;
SET @COUNTER = @COUNTER + 1
END
COMMIT
DB2有一个主autocrement键,希望在插入每一行后在DB1中传输。DB1有一个由3列组成的复合键。
DB2的设计不包括复合键
有什么方法可以加快插入速度吗?非常感谢您的帮助 我使用带有输出子句的MERGE语句,正如建议的那样,将生成的id和初始复合键插入到临时表中,以便稍后使用join进行更新 非常高效,只需15分钟,无需循环。谢谢大家! 代码如下:
BEGIN TRAN
CREATE TABLE #TempInserted
(inserted_id int,Comp_Key_1 NVARCHAR(20), Comp_Key_2 NVARCHAR(256), Comp_Key_3 NVARCHAR(256))
MERGE [DB2].[dbo].[ADDRESS] AS T -- target table T
USING (SELECT STREET,STREET_FROM,STREET_TO, Comp_Key_1,Comp_Key_2, Comp_Key_3
FROM [DB1].[dbo].[ADDRESS] AS M ) S -- source table S
ON 0=1
WHEN NOT MATCHED THEN
INSERT (STREET,STREET_FROM,STREET_TO) -- target table T
VALUES (STREET,STREET_FROM,STREET_TO) -- source table S
OUTPUT inserted.id, S.Comp_Key_1, S.Comp_Key_2, S.Comp_Key_3
INTO #TempInserted(inserted_id,Comp_Key_1,Comp_Key_2,Comp_Key_3);
update [DB1].[dbo].[ADDRESS]
set id=#TempInserted.inserted_id
FROM [BankMasterDB_migration].[dbo].LOANNUMBER AS M
JOIN #TempInserted ON M.Comp_Key_1=#TempInserted.Comp_Key_1
AND M.Comp_Key_2=#TempInserted.Comp_Key_2
AND M.Comp_Key_3=#TempInserted.Comp_Key_3
COMMIT
解释你想做什么。示例数据和期望的结果很有帮助。也许要考虑性能的第一件事是尽量避免while循环。您正在进行3次选择、一次插入和一次更新,次数为500.000次?您的解决方案正在删除循环。使用带有输出子句的MERGE语句一次检索所有插入记录的标识值,以便您可以将它们匹配到以后的更新。INSERT、update和DELETE还有子句。编写一条INSERT语句,将所有内容加载到第一个表中,并使用INSERT将生成的ID插入临时/临时表中。。。输出inserted.ID,inserted.Comp\u Key\u 1。。。坐到桌子上。在UPDATE语句中与表联接