我正在测试 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
我为实现这个目标做了什么:
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)