【发布时间】:2014-12-07 03:01:21
【问题描述】:
我在 ORACLE 中创建了一个查询:
SELECT SUBSTR(title,1,INSTR(title,' ',1,1)) AS first_word, COUNT(*) AS word_count
FROM FILM
GROUP BY SUBSTR(title,1,INSTR(title,' ',1,1))
HAVING COUNT(*) >= 20;
运行后的结果:
539 rows selected. Elapsed: 00:00:00.22
我需要改进它的性能并创建了一个function-based index:
CREATE INDEX INDX_FIRSTWRD ON FILM(SUBSTR(title,1,INSTR(title,' ',1,1)));
在本文顶部运行相同的查询后,我仍然获得相同的性能:
539 rows selected. Elapsed: 00:00:00.22
索引没有被应用或覆盖,还是我做错了什么?
感谢您提供的任何帮助。 :)
编辑:
Execution Plan:
----------------------------------------------------------
Plan hash value: 2033354507
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 20000 | 2968K| 138 (2)| 00:00:02 |
|* 1 | FILTER | | | | | |
| 2 | HASH GROUP BY | | 20000 | 2968K| 138 (2)| 00:00:02 |
| 3 | TABLE ACCESS FULL| FILM | 20000 | 2968K| 136 (0)| 00:00:02 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(COUNT(*)>=20)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
471 consistent gets
0 physical reads
0 redo size
14030 bytes sent via SQL*Net to client
908 bytes received via SQL*Net from client
37 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
539 rows processed
【问题讨论】:
-
查询计划是否显示正在使用索引?由于您需要读取表(或索引)中的每一行,我不认为索引会带来巨大的好处,除非
film表比索引大很多。 -
@JustinCave 我如何显示该查询的查询计划,因为当我在查询前面键入 EXPLAIN PLAN FOR 时,我只会得到解释的结果。
-
如果您使用的是 SQL*Plus,请在运行语句之前运行
set autotrace on。您使用的是什么版本的 Oracle? -
@JustinCave - 我已经用执行计划编辑了我的原始帖子。我正在使用 Oracle 11g。根据执行计划,这是否意味着它没有使用索引?
-
你抱怨响应时间是 22 毫秒???
标签: oracle performance indexing