CONNECT alll/all
SELECT /*+ FIRST_ROWS(25) */ employee_id, department_id
FROM hr.employees
WHERE department_id > 50;
Execution Plan
Plan hash value: 2056577954
| Id | Operation | Name | Rows | Bytes |
| 0 | SELECT STATEMENT | | 25 | 200
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 25 | 200
|* 2 | INDEX RANGE SCAN | **EMP_DEPARTMENT_IX** | |
SQL> select * from user_indexes where index_name = 'EMP_DEPARTMENT_IX';
no rows selected
注意:在某些其他架构中,EMPLOYEES表的DEPARTMENT列上有一个同名的索引。当该指数被删除时,将对员工进行全表扫描。
优化器可以在这里使用来自其他模式的其他索引吗?
答案 0 :(得分:2)
您已作为用户ALLL连接,但您正在查询HR模式中的表:
SELECT /*+ FIRST_ROWS(25) */ employee_id, department_id
FROM hr.employees
WHERE department_id > 50;
您在问题中强调了其他架构,但似乎忽略了您查询的表也在另一个架构中。 employees表格也不会出现在user_tables
中。
正在使用的索引与该表相关联,因此它可能位于相同的HR模式中。您可以在all_indexes
或dba_indexes
中看到它;即使你看不到它,优化器也会使用它。并且它不必与表格在同一个模式中,尽管它通常是;在这些视图中,您可能会注意到单独的所有者和表所有者列。
如果在访问其他人的表时只能使用自己架构中的索引,那么架构模型就会崩溃。每个用户都必须创建自己的索引副本,这将是站不住脚的。
您甚至不一定必须能够看到该表 - 如果您查询隐藏基础表的视图(因此您只在视图上选择了priv),索引仍将在后台使用。如果存在表的同义词,或者您更改了默认架构,则可能并不总是显式使用架构前缀。
答案 1 :(得分:0)
尝试查看memisc
:
SYS.INDEXES
您已经注意到,听起来您不是索引的所有者。只要您的用户可以访问表数据,优化器就应该使用索引。