)
----------
327680
t是用户hr里的一张比较大的表。
我们在列id上建索引index_t:(下面有用)
SQL> create index index_t on t(id);
索引已创建。
分析一下表:
SQL> exec dbms_stats.gather_table_stats('HR','T'); oracle提供了这个分析包
PL/SQL 过程已成功完成。
当然你也可以使用之前版本提供的工具:
SQL> analyze table t1 compute statistics;
表已分析。
删除分析: SQL> analyze table t1 delete statistics;
表已分析。
Total Blocks 表示分配给表的总的blocks 数。 Unused Blocks 表示位于高水位线以上的从未使用的数据块个数。
上面的参数不一一介绍,感兴趣的可以研究。
通过执行计划分析:
SQL> set autotrace traceonly;
SQL> select * from t;(执行了两次,此为第二次结果)
已选择327680行。
执行计划
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 327K| 2240K| 172 (2)| 00:00:03 |
| 1 | TABLE ACCESS FULL| T | 327K| 2240K| 172 (2)| 00:00:03 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
22418 consistent gets
0 physical reads
0 redo size
6379306 bytes sent via SQL*Net to client
240710 bytes received via SQL*Net from client
21847 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
327680 rows processed
执行计划
----------------------------------------------------------
Plan hash value: 1601196873
从上面可以看出,逻辑读了22418次。
我们此时delete表t,但是不会降低HWM:
表t虽然被delete的那部分被删除,但是被占用的那部分内空间存仍然没被释放,可以通过alter table t move来释放存储空间:
alter table move 主要有两方面的作用: 1、用来移动table 到其他表空间。 2、用来减少table 中的存储碎片,优化存储空间和性能。
SQL> alter table t move (tablespace users) online;(此时别的会话可以正常访问此表)
表已更改。
此时rows的rowid也会改变。
SQL> select * from t; (执行了两次,此为第二次结果)
已选择131072行。
执行计划
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 327K| 2240K| 172 (2)| 00:00:03 |
| 1 | TABLE ACCESS FULL| T | 327K| 2240K| 172 (2)| 00:00:03 |
--------------------------------------------------------------------------
统计信息
----------------------------------------------------------
1 recursive calls
0 db block gets
9274 consistent gets
0 physical reads
0 redo size
4020151 bytes sent via SQL*Net to client
96533 bytes received via SQL*Net from client
8740 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
131072 rows processed
此时的逻辑读已经降低为9274。
但是此时造成建立在id上的索引不可用:
此时我们可以通过重建索引来解决:
alter index index_t rebuild (tablespace users) online;(此时如果不加online,则不能进行delete,update,insert操作,对于大表来说,很慢)
SQL> alter index index_t rebuild online;
索引已更改。
索引重新可以使用:?