我已经执行了下面的查询,但是没有使用索引。
以下是下表可用的索引:我提供了为查询生成的解释计划。有人能告诉我为什么不使用索引吗?我也多次收集表的统计数据。
wms_area_master - Index name: WMS_AREA_MASTER_PK - Index columns: DC_CODE, DC_AREA
wms_bin_master - WMS_BIN_MASTER_IDX - DC_CODE, DC_AREA
EXPLAIN PLAN FOR
SELECT *
from wms_area_master wam ,
wms_bin_master wbm
where WAM.DC_CODE = wBM.DC_CODE
and WAM.DC_AREA = wBM.DC_AREA;
select * from table(dbms_xplan.display);
Plan hash value: 2387754896
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 41079 | 12M| 252 (2)| 00:00:01 |
|* 1 | HASH JOIN | | 41079 | 12M| 252 (2)| 00:00:01 |
| 2 | TABLE ACCESS FULL| WMS_AREA_MASTER | 217 | 32984 | 4 (0)| 00:00:01 |
| 3 | TABLE ACCESS FULL| WMS_BIN_MASTER | 41058 | 6214K| 248 (2)| 00:00:01 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - access("WAM"."DC_CODE"="WBM"."DC_CODE" AND
"WAM"."DC_AREA"="WBM"."DC_AREA")
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
- this is an adaptive plan
- 1 Sql Plan Directive used for this statement谢谢
发布于 2022-02-15 11:49:18
您的查询似乎没有任何谓词,只是联接条件,因此这里似乎没有任何使用索引的理由。因为您需要从两个表中读取所有数据,所以最快的方法是进行表扫描。使用索引不一定更快,做表扫描也不一定更慢--这取决于您需要访问多少数据。
如果查询中有限制返回的行的谓词,Oracle可能会发现对这些列使用索引是有利的。如果您的投影(select中的列)列表仅是索引的一部分,而不是表中的每一列,那么,如果索引段比表段要小得多,甲骨文可能会选择对索引进行全面扫描,而不是对表进行扫描。
https://stackoverflow.com/questions/71125804
复制相似问题