欢迎光临
Corasql

oracle在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)

实验环境:Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 – 64bit Production

1、创建表插入数据

SQL> create table txtx(id int,name char(2),tx char(3),id1 int,primary key(id,name,tx));

表已创建。

SQL> insert into txtx values(1,'tx','tx',1);

已创建 1 行。

SQL> insert into txtx values(2,'tx','tx',2);

已创建 1 行。

SQL> insert into txtx values(3,'tx','tx',3);

已创建 1 行。

SQL> commit;

SQL> select * from txtx;

        ID NA TX         ID1

———- — — ———-

         1 tx tx           1

         2 tx tx           2

         3 tx tx           3

2、执行计划

SQL> explain plan for select * from txtx  where id=1 and id1 =1 and tx='tx';

已解释。

SQL> set linesize 200

SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT

——————————————————————————————————————————————————————————————————–

Plan hash value: 4191381592

————————————————————————–

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

————————————————————————–

|   0 | SELECT STATEMENT  |      |     1 |    35 |     3   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| TXTX |     1 |    35 |     3   (0)| 00:00:01 |

————————————————————————–

Predicate Information (identified by operation id):

—————————————————

PLAN_TABLE_OUTPUT

——————————————————————————————————————————————————————————————————–

   1 – filter("ID"=1 AND "ID1"=1 AND "TX"='tx')

Note

—–

   – dynamic sampling used for this statement (level=2)

已选择17行。

通过以上执行计划,可以看出,不含前导列,进行了全表扫描,以下使用了前导列,查询速度就上来了

SQL> explain plan for select * from txtx  where id=1 and name ='tx' and tx='tx';

已解释。

SQL> select * from table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT

——————————————————————————————————————————————————————————————————–

Plan hash value: 913771524

——————————————————————————————–

| Id  | Operation                   | Name         | Rows  | Bytes | Cost (%CPU)| Time     |

——————————————————————————————–

|   0 | SELECT STATEMENT            |              |     1 |    35 |     1   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID| TXTX         |     1 |    35 |     1   (0)| 00:00:01 |

|*  2 |   INDEX UNIQUE SCAN         | SYS_C0024000 |     1 |       |     1   (0)| 00:00:01 |

——————————————————————————————–

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT

——————————————————————————————————————————————————————————————————–

—————————————————

   2 – access("ID"=1 AND "NAME"='tx' AND "TX"='tx')

已选择14行。

未经允许不得转载:CORASQL » oracle在组合索引上,只使用部分列进行查询(查询时必须包含前导列,否则会走全表扫描)

分享到:更多 ()

评论 抢沙发

评论前必须登录!

DBA是一种生活方式,优化是一种生活态度

OracleMySQL