DB2表扫描使用主键之间的联接



在db2数据库中,我正在运行以下查询:

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

其中";id";是唯一的";主键";在";神话般的";

解释显示了一个表格扫描:

RETURN  
MSJOIN 
TBSCAN    
SORT     
mytable  TBSCAN 
FILTER    
TBSCAN   
SORT     
mytable  TBSCAN 

如果我在其他表中进行相同的查询,我会得到我所期望的:主键(pk(的使用:

RETURN
MSJOIN
othertable  FETCH 
PK_othertable  IXSCAN
FILTER
othertable  FETCH 
PK_othertable  IXSCAN

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

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

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

优化指南可能看起来像:

(让Db2使用具有特定索引名称的IXSCAN选择一些JOIN请求,如MSJOIN、NLJOIN等(:

<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>

或者使用任何其他可接受的准则来获得所需的访问计划
有关更多详细信息,请参阅优化配置文件和指导原则主题。

比较每个访问计划的总成本,以了解为什么Db2更喜欢某个特定的访问计划(可能总成本最小(。

最新更新