在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更喜欢某个特定的访问计划(可能总成本最小(。