|
没错,全表扫描的话,确实只需要读一次。我猜想Oracle此时明白无论怎样,读这些块肯定能够满足查询的要求。
SQL> DECLARE
2 V_SQL VARCHAR2(32767);
3 BEGIN
4 V_SQL := 'CREATE TABLE T_256 (';
5 FOR I IN 1 .. 256 LOOP
6 V_SQL := V_SQL || 'C' || I || ' NUMBER,';
7 END LOOP;
8 V_SQL := RTRIM(V_SQL, ',') || ')';
9 EXECUTE IMMEDIATE V_SQL;
10 END;
11 /
PL/SQL 过程已成功完成。
SQL> BEGIN
2 EXECUTE IMMEDIATE 'INSERT INTO T_256 VALUES (' || LPAD('1,', 510, '1,') |
| '1)';
3 COMMIT;
4 END;
5 /
PL/SQL 过程已成功完成。
SQL> insert into t_256 select * from t_256;
已创建 1 行。
SQL> analyze table t_256 compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks,avg_space,avg_row_len,chain_cnt from us
er_tables where table_name='T_256';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN CHAIN_CNT
---------- ---------- ------------ ---------- ----------- ----------
65536 7300 124 1008 777 0
SQL> BEGIN
2 EXECUTE IMMEDIATE 'INSERT INTO T_256 VALUES (' || LPAD('2,', 510, '2,') |
| '2)';
3 COMMIT;
4 END;
5 /
PL/SQL 过程已成功完成。
SQL> analyze table t_256 compute statistics;
表已分析。
SQL> select num_rows,blocks,empty_blocks,avg_space,avg_row_len,chain_cnt from us
er_tables where table_name='T_256';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN CHAIN_CNT
---------- ---------- ------------ ---------- ----------- ----------
65537 7300 124 1008 777 0
SQL> set autot trace exp stat
SQL> select count(*) from t_256;
执行计划
----------------------------------------------------------
Plan hash value: 49459998
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 1981 (1)| 00:00:24 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| T_256 | 65537 | 1981 (1)| 00:00:24 |
--------------------------------------------------------------------
统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
7310 consistent gets
0 physical reads
0 redo size
425 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
但是,当使用的是ROWID,无论是user指定的rowid还是通过索引查询到的rowid,结果完全不同。
SQL> select rowid from t_256 where rownum=1;
ROWID
------------------
AAAQxQAAEAAAAiDAAB
SQL> select * from t_256 where rowid='AAAQxQAAEAAAAiDAAB';
执行计划
----------------------------------------------------------
Plan hash value: 411776331
------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 524 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY USER ROWID| T_256 | 1 | 524 | 1 (0)| 00:00:01 |
------------------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
2 consistent gets
0 physical reads
0 redo size
15866 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
SQL> create index t_256_idx on t_256(c1);
索引已创建。
SQL> exec dbms_stats.gather_table_stats(user,'T_256',method_opt=>'for all column
s',cascade=>true);
PL/SQL 过程已成功完成。
SQL> select num_rows,blocks,empty_blocks,avg_space,avg_row_len,chain_cnt from us
er_tables where table_name='T_256';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE AVG_ROW_LEN CHAIN_CNT
---------- ---------- ------------ ---------- ----------- ----------
65537 7300 124 1008 768 0
SQL> select /*+ index(t_256) */ * from t_256 where c1='2';
执行计划
----------------------------------------------------------
Plan hash value: 717313301
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 32769 | 24M| 3713 (1)| 00:00:45 |
| 1 | TABLE ACCESS BY INDEX ROWID| T_256 | 32769 | 24M| 3713 (1)| 00:00:45 |
|* 2 | INDEX RANGE SCAN | T_256_IDX | 32769 | | 64 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("C1"=2)
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
15885 bytes sent via SQL*Net to client
416 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
看看到底读了哪些块:
SQL> alter session set events '10202 trace name context forever';
会话已更改。
SQL> select /*+ index(t_256) */ * from t_256 where c1='2';
SQL> alter session set events '10202 trace name context off';
会话已更改。
Consistent read complete...
Block header dump: 0x0100260c --索引leaf,Branch不在10202中列出,因此,10202只有3个块
Object id on Block? Y
seg/obj: 0x10c51 csc: 0x00.80e172 itc: 2 flg: E typ: 2 - INDEX
brn: 0 bdba: 0x1002600 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x02 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.0080e172
Consistent read complete...
Block header dump: 0x01002506 --第一次读
Object id on Block? Y
seg/obj: 0x10c50 csc: 0x00.80e0c5 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1002500 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0013.009.0000043f 0x0340194c.03b9.41 C--- 0 scn 0x0000.0080e0c2
0x02 0x000c.00a.00000385 0x03418aac.0264.4e --U- 2 fsc 0x0000.0080e0f7
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
Consistent read complete...
Block header dump: 0x01002506 --第二次读
Object id on Block? Y
seg/obj: 0x10c50 csc: 0x00.80e0c5 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1002500 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0013.009.0000043f 0x0340194c.03b9.41 C--- 0 scn 0x0000.0080e0c2
0x02 0x000c.00a.00000385 0x03418aac.0264.4e --U- 2 fsc 0x0000.0080e0f7
0x03 0x0000.000.00000000 0x00000000.0000.00 C--- 0 scn 0x0000.00000000
[ 本帖最后由 sundog315 于 2010-6-28 10:12 编辑 ] |
|