Этот же запрос имеет вложенные циклы при использовании с INSERT, но Hash Match без - PullRequest
0 голосов
/ 23 апреля 2010

У меня есть две таблицы, одна имеет около 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 - это первичный ключ с кластеризованным индексом.

Почему он использует вложенный цикл для вставок, которые используют соединение? Есть ли способ улучшить производительность объединения для вставки?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010

Несколько мыслей:

  1. Убедитесь, что ваша статистика актуальна.Плохая статистика объясняет многие странные «периодические» проблемы плана запросов.

  2. Убедитесь, что ваши индексы покрывают , в противном случае вероятность игнорирования оптимизатором намного вышеих.

  3. Если ничего из этого не помогает, вы всегда можете форсировать конкретное объединение, написав INNER HASH JOIN, а не INNER JOIN.

1 голос
/ 23 апреля 2010

Есть ли у таблицы назначения кластерный индекс? Выбор объединения может быть необходимым для упорядочения данных во вставке. Я видел, что планы выполнения различаются в зависимости от того, имеет ли таблица назначения кластеризованный индекс и в каких столбцах он находится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...