【发布时间】:2015-09-08 10:00:36
【问题描述】:
我对此有点困惑,希望有人能提供帮助。我正在阅读 Markus Winand 的优秀 Use The Index Luke 书籍,其中有关于连接索引的内容。
创建了一个(EMPLOYEE_ID, SUBSIDIARY_ID) 索引,所以当他查询时
SELECT first_name, last_name
FROM employees
WHERE subsidiary_id = 20
这个执行计划出现了:
----------------------------------------------------
| Id | Operation | Name | Rows | Cost |
----------------------------------------------------
| 0 | SELECT STATEMENT | | 106 | 478 |
|* 1 | TABLE ACCESS FULL| EMPLOYEES | 106 | 478 |
----------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("SUBSIDIARY_ID"=20)
但事情是这样的:在我自己的员工表 (empno, ename, init, job, mgr, bdate, msal, comm, deptno) 上,我在 (ENAME, JOB) 上创建了一个连接索引
查询select ename from employees where job = 'TRAINER'; 给了我以下执行计划:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 4271702361
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 45 | 1 (0)| 00:00:01 |
|* 1 | INDEX SKIP SCAN | ENAME_INDEX | 3 | 45 | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
1 - access("JOB"='TRAINER')
filter("JOB"='TRAINER')
所以现在我有点困惑。
1) 为什么我的索引尽管有顺序,但仍然被使用?
2) 索引跳过扫描是否适用于我不使用 where 子句中的第一列的任何连接索引?
3) 索引跳过扫描是否会对性能产生重大影响?
4) 为什么同时存在访问谓词和过滤谓词?
当我在这里的时候,我还有一个问题
5) 在索引日期时我需要采取任何预防措施吗?
【问题讨论】: