2、映利用索引进行区间扫描的成本,说得可能有点抽象,我们做一个有趣的实验说明一下吧: 第一步,在Oracle中建立一个表Source,该表很简单,就两个字段,脚本如下: create table Source ( x int , y int ); 第二步,向Source里面插入100万条记录,其中x从1到1000000中按顺序取值,而y则是以随机数。 begin for i in 1 .. 1000000 loop insert into source(x,y) values ( i ,
3、 to_char(dbms_random.random,'99999999999999999') ); end loop; end; commit; 第三步,基于Source表的数据,再创建两张表tab01、tab02,并为这两个表的x字段添加索引,最后分析统计一下信息。 建表语句如下: create table tab01 as select * from source; create table tab02 as select * from source order by y; cre
4、ate index idx01 on tab01(x); create index idx02 on tab02(x); begin dbms_stats.gather_table_stats( user , 'tab01' , cascade=>true ); dbms_stats.gather_table_stats( user , 'tab02' , cascade=>true ); end; 第四步,运行两个查询语句(将Autotrace打开)。 select avg(y/(x+1)
5、) from tab01 where x between 10000 and 30000; select avg(y/(x+1)) from tab02 where x between 10000 and 30000; 这两个查询查询非常简单,执行的速度也很快,我在普通PC机中的虚拟机(有点拗口)上面执行用了不到1秒就搞定了。 但是,这两个查询的执行计划,还有consistentgets的数字是不一样的。第一个查询: game@ora10g(oracle01) SQL> select avg(y/
6、(x+1)) from tab01 where x between 10000 and 30000; Elapsed: 00:00:00.02 --------------------------------------------------------------------------------------