У меня есть две таблицы, одна имеет около 1500 записей, а другая около 300000 дочерних записей. Соотношение 1: 200. Я ставлю родительскую таблицу в промежуточную таблицу SomeParentTable_Staging, а затем я размещаю все ее дочерние записи, но мне нужны только те, которые относятся к записям, которые я поставил в родительской таблице. Поэтому для выполнения этой постановки я использую приведенный ниже запрос, объединив с поэтапными данными родительских таблиц.
--Stage child records
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;
План выполнения указывает, что таблицы объединяются с помощью вложенного цикла. Когда я запускаю только выбранную часть запроса без вставки, соединение выполняется с помощью Hash Match. Таким образом, оператор select такой же, но в контексте вставки он использует более медленный вложенный цикл. Я добавил некластеризованный индекс для D.SomeParentTableID, чтобы по обеим сторонам соединения был индекс. I.SomeParentTableID - это первичный ключ с кластеризованным индексом.
Почему он использует вложенный цикл для вставок, которые используют соединение? Есть ли способ улучшить производительность объединения для вставки?