Oracle索引分析与比较(3)

5CBO模式下表很久没分析,表的增长明显,优化器采取了全表扫描。

SQL> select * from test.testindex where a like '1%';

A             B

---- ----------

1             2

1             1

10           10

11           11

12           12

13           13

14           14

15           15

16           16

17           17

18           18

19           19

100         100

已选择13行。

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=13 Bytes=52)

   1   0  TABLE ACCESS (FULL) OF 'TESTINDEX' (Cost=1 Card=13 Bytes=52)

(表一共102行,选择比例为13/102>10%,优化器选择了全表扫描)

――――――――――――――――――――――――――――――――――

增加表行数

SQL> declare i number;

  2  begin

  3  for i in 200 .. 1000 loop

  4  insert into test.testindex values (to_char(i),i);

  5  end loop;

  6  end;

  7  /

PL/SQL 过程已成功完成。

SQL> commit;

提交完成。

SQL> select count(*) from test.testindex;

  COUNT(*)

----------

903

SQL> select * from test.testindex where a like '1%';

A             B

----  ----------

1             2

1             1

10           10

11           11

12           12

13           13

14           14

15           15

16           16

17           17

18           18

19           19

100          100

1000         1000

已选择14行。

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=13 Bytes=52)

   1  0  TABLE ACCESS (FULL) OF 'TESTINDEX' (Cost=1 Card=13 Bytes=52)

  (表一共903行,选择比例为14/903<5%,优化器选择了全表扫描,选择路径是错误的)

―――――――――――――――――――――――――――――

给表做分析

SQL> analyze table test.testindex compute statistics for table for all indexed c

olumns for all indexes;

表已分析。

SQL> select * from test.testindex where a like '1%';

A             B

---- ----------

1             2

1             1

10           10

100         100

1000       1000

11           11

12           12

13           13

14           14

15           15

16           16

17           17

18           18

19           19

已选择14行。

Execution Plan

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=24 Bytes=120)

   1   0  TABLE ACCESS (BY INDEX ROWID) OF 'TESTINDEX' (Cost=4 Card=

          24 Bytes=120)

   2  1  INDEX (RANGE SCAN) OF 'IND_COLA' (NON-UNIQUE) (Cost=2 Ca

          rd=24)

(经过分析后优化器选择了正确的路径,使用了ind_cola索引)

――――――――――――――――――――――――――――――――――

小结

这篇文章介绍了oracle数据库中的各种索引,通过分析它们的结构,我们知道了它们的特点和应用范围,同时介绍了如何去避免索引失效,希望对大家有所帮助。

 

 

 

Johnny 转载自:

 

http://spaces.msn.com/roujiaweize/blog/cns!9745F14B4AEB3B72!411.entry?_c=BlogPart

 

 

你可能感兴趣的:(oracle,sql,C++,c,Access)