代码之家  ›  专栏  ›  技术社区  ›  AaronLS

同一个查询与insert一起使用时有嵌套循环,但是hash匹配时没有

  •  0
  • AaronLS  · 技术社区  · 15 年前

    我有两张桌子,一张有大约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;
    

    执行计划指示表正与嵌套循环联接。当我只运行查询的select部分而不运行insert时,将使用hash match执行连接。所以select语句是相同的,但是在insert的上下文中,它使用较慢的嵌套循环。我在d.someParentTableID上添加了非聚集索引,因此在连接的两边都有一个索引。i.someParentTableID是具有聚集索引的主键。

    为什么对使用联接的插入使用嵌套循环?是否有方法提高插入的联接的性能?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Aaronaught    15 年前

    一些想法:

    1. 确保你的统计数据是最新的。糟糕的统计数据导致了许多奇怪的“间歇性”查询计划问题。

    2. 确保索引是 覆盖 ,否则优化器忽略它们的概率要高得多。

    3. 如果这些都没有帮助,您可以通过编写 INNER HASH JOIN 与正义相反 INNER JOIN .

        2
  •  1
  •   Cade Roux    15 年前

    目标表是否有聚集索引?为了方便插入中数据的排序,可能需要选择联接。我已经看到执行计划因目标表是否有聚集索引以及它所在的列而异。