有没有机会手动重新安排执行计划?

时间:2014-11-27 11:34:26

标签: sql performance tsql sql-server-2012 sql-execution-plan

我有两张桌子,

  1. 需要
  2. NeedCategory
  3. Need table在needid列上有clusted索引,NeedCategory在needid和categoryid上有复合聚簇索引。

    现在看一下查询的以下查询和执行计划。

     SELECT N.NeedId,N.NeedName,N.ProviderName    
       FROM dbo.Need N    
       JOIN dbo.NeedCategory NC    
         ON nc.NeedId = n.NeedId     
      WHERE IsActive=1      
      AND CategoryId= 2
      ORDER BY NeedName
    

    Execution plan

    • Isactive = 1时,需要表上的聚簇索引扫描。

    • 在CategoryId = 2

    • 上发生needcategory表上的聚簇索引扫描

    我的问题是,

    1. 为什么在联接发生之前进行扫描?如果它在加入后发生,则过滤器会更轻。即使优化器选择首先执行扫描。
    2. 有没有机会手动重新安排执行计划?
    3. 提前致谢

2 个答案:

答案 0 :(得分:1)

加入后不会变轻。

为什么你认为加入后会更轻?

为什么你认为在所有nc.NeedId = n.NeedId匹配更好然后过滤呢?
如果你先过滤,那么你永远不必匹配nc.NeedId = n.NeedId,无论如何都会被淘汰。

相对便宜的Merge Join是一件好事。

让我们说我把袜子和鞋子搭配起来只想要红袜子。 为什么我要将蓝色袜子与鞋子搭配起来然后消除它。

答案 1 :(得分:0)

  1. 我们说Need表有10,000行,其中一半有IsActive = 1; NeedCategory有100行,80有CategoryID = 2。将10,000行连接到100行然后过滤结果会更快,还是扫描表以过滤行然后加入操作,匹配5,000行到80行?

  2. 您可以影响计划在特定限制内的生成方式。但是,要非常小心。 SQL Server通常比开发人员更了解数据。