我有两张桌子,一张有大约1500张唱片,另一张有大约300000张儿童唱片。大约是1:200的比例。我将父表转移到一个转移表someparenttable_staging,然后转移它的所有子记录,但我只想要与父表中转移的记录相关的记录。因此,我使用下面的查询通过与父表连接来执行此暂存数据。
INSERT INTO [dbo].[SomeChildTable_Staging]
([SomeChildTableId]
,[SomeParentTableId]
,SomeData1
,SomeData2
,SomeData3
,SomeData4
)
SELECT [SomeChildTableId]
,D.[SomeParentTableId]
,SomeData1
,SomeData2
,SomeData3
,SomeData4
FROM [dbo].[SomeChildTable] D
INNER JOIN dbo.SomeParentTable_Staging I ON D.SomeParentTableID = I.SomeParentTableID;
执行计划指示表正与嵌套循环联接。当我只运行查询的select部分而不运行insert时,将使用hash match执行连接。所以select语句是相同的,但是在insert的上下文中,它使用较慢的嵌套循环。我在d.someParentTableID上添加了非聚集索引,因此在连接的两边都有一个索引。i.someParentTableID是具有聚集索引的主键。
为什么对使用联接的插入使用嵌套循环?是否有方法提高插入的联接的性能?