首页 > 数据库 > Oracle > 为何在查询中索引未被使用(二)——问题解答
昨天只是和大家谈了下,为什么索引没有被使用的原因,那么今天来和大家分享下,这这些情况下没有使用的索引的原因进行分析下以及排错的步骤。
排错步骤
“为什么索引没有被使用”是一个涉及面较广的问题。有很多种原因会导致索引没有被使用。下面我们一起来看排错的步骤:
CREATE TABLE tdc
( x INT CONSTRAINT x_not_null NOT NULL DEFERRABLE INITIALLY DEFERRED RELY,
y INT CONSTRAINT y_not_null NOT NULL,
z VARCHAR2(30)
);
CREATE INDEX t_idx ON tdc(x);
SET CONSTRAINTS ALL IMMEDIATE; <-- 将所有延迟约束置为立即使用
SET AUTOTRACE TRACEONLY EXPLAIN
SELECT COUNT(1) FROM tdc; <-- 索引不会被使用
Execution Plan
----------------------------------------------------------
Plan hash value: 2532426293
-------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| TDC | 1 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------
| FIRST_ROWS | 相当于提示使用索引 |
| ORDERED | 强制查询的关联顺序(join order of a query)。Oracle 推荐使用 LEADING hint 因为它更好用。 |
| LEADING | 这个 hint 告诉 optimizer 先使用指定的表做连接。它比 ORDERED 更好用。 |
| INDEX | 强制使用索引扫描, 并禁用快速模式(INDEX_FFS) |
| INDEX_FFS | 强制使用快速索引扫描INDEX_FFS |
| INDEX_ASC | 强制使用升序的索引范围扫描(Ascending Index Range Scan) |
| INDEX_DESC | 强制使用降序的索引范围扫描(Descending Index Range Scan) |
pxboracle@live.com
2014.08.21 09:49
share you knowledge with the world.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26141402/viewspace-1258080/ ,如需转载,请注明出处,否则将追究法律责任。