SQL> create table t1 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=1;
Table created.
SQL> create table t2 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=10;
Table created.
SQL> create table t3 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=100;
Table created.
SQL> create table t4 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=1000;
Table created.
SQL> create table t5 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=10000;
Table created.
SQL> create table t6 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=100000;
Table created.
SQL> create table t7 as select rownum as id ,rownum+1 as id2,rpad('*',1000,'*') as contents from dual connect by level<=1000000;
Table created.
建立索引
SQL> create index idx_id_t1 on t1(id);
Index created.
SQL> create index idx_id_t2 on t2(id);
Index created.
SQL> create index idx_id_t3 on t3(id);
Index created.
SQL> create index idx_id_t4 on t4(id);
Index created.
SQL> create index idx_id_t5 on t5(id);
Index created.
SQL> create index idx_id_t6 on t6(id);
Index created.
SQL> create index idx_id_t7 on t7(id);
Index created.
SQL> set linesize 1000
SQL> set autotrace off
SQL> select index_name,
2 blevel,
3 leaf_blocks,
4 num_rows,
5 distinct_keys,
6 clustering_factor
7 from user_ind_statistics
8 where table_name in( 'T1','T2','T3','T4','T5','T6','T7');
INDEX_NAME BLEVEL LEAF_BLOCKS NUM_ROWS DISTINCT_KEYS CLUSTERING_FACTOR
------------------------------ ---------- ----------- ---------- ------------- -----------------
IDX_ID_T1 0 1 1 1 1
IDX_ID_T2 0 1 10 10 2
IDX_ID_T3 0 1 100 100 15
IDX_ID_T4 1 3 1000 1000 143
IDX_ID_T5 1 21 10000 10000 1429
IDX_ID_T6 1 222 100000 100000 14286
IDX_ID_T7 2 2226 1000000 1000000 142858
1千万条记录是3层高度。
所以一般数据量1000w条以内的记录条数,不用怎么考虑索引高度。
SQL> select * from t1 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
SQL> select /*+full(t1)*/ * from t1 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
SQL> select * from t2 where id =1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
SQL> select /*+full(t2)*/ * from t2 where id =1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
SQL> select * from t3 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
SQL> select /*+full(t3)*/ * from t3 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
19 consistent gets
SQL> select * from t4 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
SQL> select /*+full(t4)*/ * from t4 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
148 consistent gets
SQL> select * from t5 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
SQL> select /*+full(t5)*/ * from t5 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1435 consistent gets
SQL> select * from t6 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
SQL> select /*+full(t6)*/ * from t6 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
14291 consistent gets
SQL> select * from t7 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
SQL> select /*+full(t7)*/ * from t7 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
142866 consistent gets
/*
规律:
从t1到t7(表记录依次增大10倍,从1到1000000),索引读的逻辑读是 2,3,3,4,4,4,5
从t1到t7(表记录依次增大10倍,从1到1000000)全表扫描的逻辑读是 3,5,19,148,1435,14291,142866
*/
所以一般数据量1000w条以内的记录条数,不用怎么考虑索引高度。
SQL> select * from t1 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
SQL> select /*+full(t1)*/ * from t1 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
SQL> select * from t2 where id =1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
SQL> select /*+full(t2)*/ * from t2 where id =1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
SQL> select * from t3 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
3 consistent gets
SQL> select /*+full(t3)*/ * from t3 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
19 consistent gets
SQL> select * from t4 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
SQL> select /*+full(t4)*/ * from t4 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
148 consistent gets
SQL> select * from t5 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
SQL> select /*+full(t5)*/ * from t5 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1435 consistent gets
SQL> select * from t6 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
SQL> select /*+full(t6)*/ * from t6 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
14291 consistent gets
SQL> select * from t7 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
SQL> select /*+full(t7)*/ * from t7 where id=1;
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
142866 consistent gets
/*
规律:
从t1到t7(表记录依次增大10倍,从1到1000000),索引读的逻辑读是 2,3,3,4,4,4,5
从t1到t7(表记录依次增大10倍,从1到1000000)全表扫描的逻辑读是 3,5,19,148,1435,14291,142866
*/