优化程序使用当前架构中不存在的索引

时间:2015-06-16 12:39:16

标签: oracle indexing optimization

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列上有一个同名的索引。当该指数被删除时,将对员工进行全表扫描。

优化器可以在这里使用来自其他模式的其他索引吗?

2 个答案:

答案 0 :(得分:2)

您已作为用户ALLL连接,但您正在查询HR模式中的表:

SELECT /*+ FIRST_ROWS(25) */ employee_id, department_id
     FROM   hr.employees 
     WHERE  department_id > 50;

您在问题中强调了其他架构,但似乎忽略了您查询的表也在另一个架构中。 employees表格也不会出现在user_tables中。

正在使用的索引与该表相关联,因此它可能位于相同的HR模式中。您可以在all_indexesdba_indexes中看到它;即使你看不到它,优化器也会使用它。并且它不必与表格在同一个模式中,尽管它通常是;在这些视图中,您可能会注意到单独的所有者和表所有者列。

如果在访问其他人的表时只能使用自己架构中的索引,那么架构模型就会崩溃。每个用户都必须创建自己的索引副本,这将是站不住脚的。

您甚至不一定必须能够看到该表 - 如果您查询隐藏基础表的视图(因此您只在视图上选择了priv),索引仍将在后台使用。如果存在表的同义词,或者您更改了默认架构,则可能并不总是显式使用架构前缀。

答案 1 :(得分:0)

尝试查看memisc

SYS.INDEXES

您已经注意到,听起来您不是索引的所有者。只要您的用户可以访问表数据,优化器就应该使用索引。