oracle分析表操作(二)
ables where table_name='EMP';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE
---------- ---------- ------------ ----------
11 1 6 7586
11 5 3 7977
SQL>
因为对表进行了两此统计所以显示了表变化后两次次统计表的信息变化;
eg:
[sql]
SQL> analyze table emp estimate statistics sample 20 percent;
Table analyzed.
SQL> select num_rows,blocks,empty_blocks,avg_space from all_tables where table_name='EMP';
NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE
---------- ---------- ------------ ----------
11 1 6 7586
11 5 3 7977
SQL>
注意:当对表的统计sample大于50%的时候,会进行全表数据统计。
3)表的链接记录和迁移记录
什么是表的链接记录:每个表是有记录组成的,那么每天记录进行存储的时候,如果记录数据小于一个数据块的空闲空间大小,那么这条记录就被存储在一个数据块中,但是当存储一条很长的记录数据的时候,那么会把这一条记录分割成很多片段,分别存储在各个数据块中,在每个数据块的头部信息中都会存储该记录的rowid地址,当查询这条记录的时候就会从每个数据块中或许信息组成一条记录,可见这样是很消耗资源的。
什么是表的迁移记录:当一个数据块中已经存储了一条记录,但是当使用update更新了记录中的某一个字段的值,使其信息已经超出了该数据块的空闲空间大小,那么这个时候数据块就会进行数据迁移,把这条记录迁移到其他数据块中,在本数据块保存一个指向其他数据块的指针。这就是迁移记录。
查看表的迁移记录和链接记录信息,需要一个chained_row表,所有的记录信息都存储于该表中。同样该表也是不存在的,需要手动执行$ORACLE_HOME/rdbms/admin/utlchain.sql进行该表的创建,如果想对表进行链接记录和迁移记录进行统计收集信息,那么使用:analyze table table_name list chained rows into chained_rows;
utlchained.sql: rem rem $Header: utlchain.sql 07-may-96.19:40:01 sbasu Exp $ rem Rem Copyright (c) 1990, 1995, 1996, 1998 by Oracle Corporation Rem NAME REM UTLCHAIN.SQL Rem FUNCTION Rem Creates the default table for storing the output of the Rem analyze list chained rows command Rem NOTES Rem MODIFIED Rem syeung 06/17/98 - add subpartition_name Rem mmonajje 05/21/96 - Replace timestamp col name with analyze_timestam Rem sbasu 05/07/96 - Remove echo setting Rem ssamu 08/14/95 - merge PTI with Objects Rem ssamu 07/24/95 - add field for partition name Rem glumpkin 10/19/92 - Renamed from CHAINROW.SQL Rem ggatlin 03/09/92 - add set echo on Rem rlim 04/29/91 - change char to varchar2 Rem Klein 01/10/91 - add owner name for chained rows Rem Klein 12/04/90 - Creation Rem create table CHAINED_ROWS ( owner_name varchar2(30), table_name varchar2(30), cluster_name varchar2(30), partition_name varchar2(30), subpartition_name varchar2(30), head_rowid rowid, analyze_timestamp date ); eg: [sql] SQL> @./utlchain.sql Table created. SQL> desc chained_rows Name Null Type ----------------------------------------- -------- ---------------------------- OWNER_NAME VARCHAR2(30) TABLE_NAME VARCHAR2(30) CLUSTER_NAME VARCHAR2(30) PARTITION_NAME VARCHAR2(30) SUBPARTITION_NAME VARCHAR2(30) HEAD_ROWID ROWID ANALYZE_TIMESTAMP DATE SQL> eg: [sql] SQL> @./utlchain.sql Table created. SQL> desc chained_rows Name Null Type ----------------------------------------- -------- ---------------------------- OWNER_NAME VARCHAR2(30) TABLE_NAME VARCHAR2(30) CLUSTER_NAME VARCHAR2(30) PARTITION_NAME VARCHAR2(30) SUBPARTITION_NAME VARCHAR2(30) HEAD_ROWID ROWID ANALYZE_TIMESTAMP DATE SQL> SYS@orcl#analyze table emp list chained rows into chained_rows; 表已分析。 SYS@orcl#select * from chained_rows; 未选定行 SYS@orcl#
注意:当表存在很大的链接记录和迁移记录的时候,我们就应该考虑我们创建的表的方式是否正确,在本地管理表空间的时候,段的管理方式为segment space management manual方式的时候,我们就需要考虑pctfree和pctused参数的设置问题了。