小编Kaj*_*aja的帖子

强制Sql server在合并连接中使用索引查找

我正在测试 sql server 中的合并加入。我有一个INNER JOIN并强制优化器执行以下操作MERGE JOIN

  • ID 在个人表中是主键
  • ID 在 Abteilung 表是主键
  • 这些表中没有其他索引

     select * from  [dbo].[Personal] as P inner join [dbo].[Abteilung] as A  
     on  P.[ID]= A.[Personal_ID]   OPTION (MERGE JOIN) 
    
    Run Code Online (Sandbox Code Playgroud)

然后优化器使用这个计划来运行我的查询:

在此处输入图片说明

我想强制优化器使用index seek而不是Table Scan

我为实现这个目标做了什么:

  • 在 Table Abteilung 中的列ID,上定义分组索引Personal_ID。如果我运行查询,执行计划是这样的变化:

在此处输入图片说明

这里我有聚集索引扫描,但没有聚集索引搜索

  • 使用FORCESEEK提示。如果我使用此提示,运行查询会发生错误:

由于此查询中定义的提示,查询处理器无法生成查询计划。在不指定任何提示且不使用 SET FORCEPLAN 的情况下重新提交查询。

  • 如果我在查询中添加 where 子句,则查询将更改为:

      select * from  [dbo].[Personal] as P inner join [dbo].[Abteilung] as A  
      on P.[ID]= A.[Personal_ID] where A.[Personal_ID]=2 
      OPTION (MERGE    JOIN) …
    Run Code Online (Sandbox Code Playgroud)

sql-server optimization execution-plan sql-server-2012

2
推荐指数
1
解决办法
5421
查看次数