什么复合索引前导列?

来源:互联网 发布:c语言书籍下载txt 编辑:程序博客网 时间:2024/06/10 15:55

在oracle中,我们经常以为建立了索引,sql查询的时候就会如我们所希望的那样使用索引,事实上,oracle只会在一定条件下使用索引,这里我们总结数第一点:oracle会在条件中包含了前导列时使用索引,即查询条件中必须使用索引中的第一个列,请看下面的例子

 

 

 

建立一个联合索引(注意复合索引的索引列顺序)

SQL> create index emp_id1 on emp(empno,ename,deptno);

 

 

下面的查询由于没有使用到复合索引的前导列,所以没有使用索引

 
 

 SQL> select job, empno from emp where ename='MILLER';

JOB            EMPNO
--------- ----------
CLERK           7934


Execution Plan
----------------------------------------------------------
          0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=1 Bytes=18)


          1                  0
  TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=1 Bytes=18)

 

 

下面的查询使用了复合索引中的前导列,所以查询走索引了

SQL> select job, empno from emp where empno=7934 and ename='MILLER';
JOB            EMPNO
--------- ----------
CLERK           7934

Execution Plan
----------------------------------------------------------
          0
SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1 Bytes=18)

          1                  0
  TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (TABLE) (Cost=2 Card=1 Bytes=18)

          2                  1
    INDEX (RANGE SCAN) OF 'EMP_ID1' (INDEX) (Cost=1 Card=1)