避免对表Oracle进行全表扫描

qq24tv8q  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(210)

我有一个有70列的表,其中主键是15列的组合(包括number和varchar2)。

select * from tab1 where k1=1234567889; 

Plan hash value: 1179808636
---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |  6044 |  2201K|  4585K  (1)| 15:17:04 |
|*  1 |  TABLE ACCESS FULL| tab1        |  6044 |  2201K|  4585K  (1)| 15:17:04 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 – filter ("K1"=30064825087)

其中tab1是上面提到的表,k1是主键的一部分列。表未分区。表也被分析(表、索引和列)。上述查询的输出返回100000多条记录。问题是即使在k1列上有PK之后,查询仍在执行全表扫描,这是不可接受的。另一方面,使用索引提示并不能真正加快进程。
请告知可能的解决方案。

mbyulnm0

mbyulnm01#

对于 此 查询 :

select *
from tab1
where k1 = 1234567889;

中 的 每 一 个
最 好 的 索引 是 以 k1 作为 索引 的 第 一 个 键 。 可以 有 一 个 复合 索引 , 因为 k1 必须 是 第 一 个 键 。 听 起来 你 有 一 个 复合 主键 , 而 k1 不是 第 一 个 键 。
我 建议 您 定义 另 一 个 索引 :

create index idx_tab1_k1 on tab1(k1);

格式

xqkwcwgp

xqkwcwgp2#

有几种方法可以避免全表扫描
索引:确保键值上存在索引,并且已使用dbms_stats. Use_nl hint对索引进行了分析:您可以指示优化程序使用嵌套循环连接(需要索引)。索引提示:您可以指定要使用的索引。

相关问题