sql - 根据解释计划,左连接索引失败
问题描述
我正在尝试运行以下查询,并且我正在加入索引字段(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 知道我哪里出错了,以及如何改变它以使其更快
解决方案
评论太长了。
就个人而言,我希望 OracleMY_HBS(M_KEYID)
使用JOIN
. 但是,有一些减轻处罚的情况:
- 这张桌子很小,适合(大概)在一页上。
- 索引不包括查询(您正在选择其他列)。
优化器正在平衡多个考虑因素。线性扫描 124 条记录的列表并不一定比加载索引、遍历索引、然后加载(单个)数据库更糟糕。
推荐阅读
- java - Write big files using RandomAccessFile class
- javascript - 在文本框上更改输入时调用函数?
- r - Image processing: Average grayscale images
- c++ - 如何在 C++ 模板化列表类中实现高效添加
- sql - 如何使用 SQLServer 在 VbNet 中使用 SQLCommand 保护输入顺序
- javascript - 使用 Firebase 实时数据库为两名玩家回合制游戏构建和检索数据的最有效方法
- python - 是否可以使用 mypy 以编程方式获取推断的类型信息?
- android - 构建应用程序包时禁用即时应用程序
- android - Flutter - 我无法使用 Google 帐户登录
- xml - SelectSingleNode 返回错误有一个无效的令牌