我有一个有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之后,查询仍在执行全表扫描,这是不可接受的。另一方面,使用索引提示并不能真正加快进程。
请告知可能的解决方案。
2条答案
按热度按时间mbyulnm01#
对于 此 查询 :
中 的 每 一 个
最 好 的 索引 是 以
k1
作为 索引 的 第 一 个 键 。 可以 有 一 个 复合 索引 , 因为k1
必须 是 第 一 个 键 。 听 起来 你 有 一 个 复合 主键 , 而k1
不是 第 一 个 键 。我 建议 您 定义 另 一 个 索引 :
格式
xqkwcwgp2#
有几种方法可以避免全表扫描
索引:确保键值上存在索引,并且已使用dbms_stats. Use_nl hint对索引进行了分析:您可以指示优化程序使用嵌套循环连接(需要索引)。索引提示:您可以指定要使用的索引。