2011-12-01 53 views
1

此查询需要16秒运行SQL Server 2008 R2的 - 看似矛盾的加入导致查询很慢

SELECT 
    WO.orderid 
FROM 
    WebOrder as WO 
    INNER JOIN Addresses AS A ON WO.AddressID = A.AddressID 
    LEFT JOIN SalesOrders as SO on SO.SO_Number = WO.SalesOrderID 

如果我注释掉任何的连接,它运行在一小部分一秒。例子:存在

SELECT 
    WO.orderid 
FROM 
    WebOrder as WO 
    INNER JOIN Addresses AS A ON WO.AddressID = A.AddressID 
    -- LEFT JOIN SalesOrders as SO on SO.SO_Number = WO.SalesOrderID  

SELECT 
    WO.orderid 
FROM 
    WebOrder as WO 
    -- INNER JOIN Addresses AS A ON WO.AddressID = A.AddressID 
    LEFT JOIN SalesOrders as SO on SO.SO_Number = WO.SalesOrderID 

  • 约40,000记录每个在表SalesOrders表和位址,
  • 我有在ON子句中使用的所有字段的索引或PKeys。

的慢版的执行计划(SalesOrders的加入注释掉)

enter image description here

快速版本

enter image description here



012执行计划为什么这些连接在一起使用时会导致从0.01秒到16秒?

+2

您是否尝试过索引重建,更新统计信息和'DBCC FREEPROCCACHE'? –

+0

重建相关表中的索引修复了它。请作为答复发布。 –

+0

很高兴我能帮到你。回答是根据要求发布的。 –

回答

2

你执行计划不显示任何昂贵的操作,我想尝试以下解决糟糕的表现:

  • 重建索引
  • 更新统计
  • DBCC FREEPROCCACHE

个人我不希望后者做任何事情 - 它看起来像你有一个明智的查询计划,因为它是。

+0

优秀的答案。在我的情况下,重建涉及的所有表索引做了诀窍。我确实注意到其中一个索引的碎片值大于8.0。 –