首页 > 解决方案 > 根据解释计划,左连接索引失败

问题描述

我正在尝试运行以下查询,并且我正在加入索引字段(hdr.M_KEYID)上的表,但我仍然在解释计划中看到 TABLE ACCESS FULL 。你能否让我知道我哪里出错了,以及如何改变它以使其更快

以下是每个表的索引

MY_H2S 上的索引

M_KEY0
M_KEY1  

MY_HBS 的索引

M_DATE
M_KEYID
M_DATE

询问:

select 
bdy.M_DATE as M_DATE,
M_KEY0 as M_KEY0,
M_KEY1 as M_KEY1 ,
(M_B_F+M_A_F)/2  as M_PRICE,
bdy.M_DATE as M_DATE
from 
MY_H2S hdr left join MY_HBS bdy on hdr.M_KEYID = bdy.M_KEYID

解释计划:

 ----------------------------------------------------------------------------------
 | Id  | Operation          | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
 ----------------------------------------------------------------------------------
 |   0 | SELECT STATEMENT   |             |   182K|    12M|   458   (1)| 00:00:06 |
 |*  1 |  HASH JOIN OUTER   |             |   182K|    12M|   458   (1)| 00:00:06 |
 |   2 |   TABLE ACCESS FULL| MY_H2S      |   124 |  3968 |     3   (0)| 00:00:01 |
 |   3 |   TABLE ACCESS FULL| MY_HBS      |   182K|  7288K|   455   (1)| 00:00:06 |
 ----------------------------------------------------------------------------------

您能否让 mw 知道我哪里出错了,以及如何改变它以使其更快

标签: sqloracle

解决方案


评论太长了。

就个人而言,我希望 OracleMY_HBS(M_KEYID)使用JOIN. 但是,有一些减轻处罚的情况:

  • 这张桌子很小,适合(大概)在一页上。
  • 索引不包括查询(您正在选择其他列)。

优化器正在平衡多个考虑因素。线性扫描 124 条记录的列表并不一定比加载索引、遍历索引、然后加载(单个)数据库更糟糕。


推荐阅读