在一个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?
1条答案
按热度按时间im9ewurl1#
Db2使用基于成本的优化器。
它可能决定TBSCAN对于某些查询更便宜。
您可以尝试使用相应的提示(在Db2中称为优化指南)获取所需的访问计划,如下所示:
其中优化准则可以看起来像:
(let Db2选择一些JOIN请求,如MSJOIN、NLJOIN等(使用具有特定索引名称的IXSCAN):
(NLJOIN与IXSCAN使用任何适当的索引):
或者使用任何其他可接受的准则来获得所需的访问计划。
如需详细信息,请参阅Optimization profiles and guidelines主题。
比较每个访问计划的总成本,以了解Db2为什么更喜欢某个特定的访问计划(可能具有最小的总成本)。