sql - SQL Server 使用 INSERT INTO 加速 WHILE 循环
问题描述
SQL WHILE 循环在插入时很慢。有什么办法可以加快查询速度?
我想插入 500,000 行。如果每 10,000 行之后有一个提交,它会更快吗?
例子:
将行从 DB1 插入到 DB2 并从 DB2 获取主自动增量键 ID 到 DB1。
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 有一个主自增键,希望在插入每一行后在 DB1 中传输。DB1 有一个由 3 列组成的复合键。DB2 的设计不包括复合键。
有什么方法可以加快插入速度吗?
解决方案
感谢您的帮助!
按照建议,我使用带有OUTPUT子句的MERGE语句,将生成的 ID 和初始复合键插入到临时表中,以便稍后通过连接进行更新。
非常高效(只用了 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
推荐阅读
- laravel - 带有条件语句的 Laravel Eager Load
- c++ - 将对象作为参数传递给 C++ 中的函数
- python - 执行某个命令时如何更新列表项(discord.py bot)
- python - 使用 Python Selenium 定位特定的 img
- python-3.x - 如何从一个列表创建一个新的元组列表
- scikit-learn - 在分类树中定义数据:有序与名义
- sql - 如何获得一个类别的子集数量?
- asp.net-core - Entity Framework Core 中现有数据库的模型。我需要与上下文类中的表名相同
- javascript - 碰撞后如何在 Matter.js 中保持速度?
- python - 如何在kivy中按按钮删除?