使用主键之间连接进行DB2表扫描

44u64gxh  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(226)

在一个db2数据库中,我运行这个查询:

select * from mytable t1 left join mytable t2 on t1.id = t2.id

其中“id”是“mytable”中唯一的“主键”
说明显示一个表扫描:

RETURN  
 MSJOIN 
  TBSCAN    
   SORT     
    mytable  TBSCAN 
  FILTER    
   TBSCAN   
   SORT     
    mytable  TBSCAN

如果我在othertable中执行相同的查询,我将获得预期的结果:主键(PK)的使用:

RETURN
MSJOIN
 othertable  FETCH 
  PK_othertable  IXSCAN
 FILTER
  othertable  FETCH 
  PK_othertable  IXSCAN

为什么在一种情况下db2在连接过程中不使用pk,而在另一种情况下像我期望的那样使用pk?

im9ewurl

im9ewurl1#

Db2使用基于成本的优化器。
它可能决定TBSCAN对于某些查询更便宜。
您可以尝试使用相应的提示(在Db2中称为优化指南)获取所需的访问计划,如下所示:

select * from mytable t1 
left join mytable t2 on t1.id = t2.id
/*
<OPTGUIDELINES>
...
</OPTGUIDELINES>

* /

;

其中优化准则可以看起来像:
(let Db2选择一些JOIN请求,如MSJOIN、NLJOIN等(使用具有特定索引名称的IXSCAN):

<OPTGUIDELINES>
  <JOIN>
    <IXSCAN TABLE="T1" INDEX="UNQUALIFIED_PK_INDEX_NAME"/>
    <IXSCAN TABLE="T2" INDEX="UNQUALIFIED_PK_INDEX_NAME"/>
  </JOIN>
</OPTGUIDELINES>

(NLJOIN与IXSCAN使用任何适当的索引):

<OPTGUIDELINES>
  <NLJOIN>
    <IXSCAN TABLE="T1"/>
    <IXSCAN TABLE="T2"/>
  </NLJOIN>
</OPTGUIDELINES>

或者使用任何其他可接受的准则来获得所需的访问计划。
如需详细信息,请参阅Optimization profiles and guidelines主题。
比较每个访问计划的总成本,以了解Db2为什么更喜欢某个特定的访问计划(可能具有最小的总成本)。

相关问题