段
一个段建立以后首先会分配一个区,区中包括含8个块,这时执行insert插入数据,当这个区写满后,会在分配一个区
1.一个段建立以后,Oracle如何给段分配区?
2.段分配到区以后,有了空闲空间,应该如何进行使用和管理呢?
段与区的管理方式
区
1.区的管理方式
数据字典
本地--------自动
手动CREATE SMALLFILE TABLESPACE "DATA1" DATAFILE '/ora/oracle/oradata/orcl/data1_01.dbf' SIZE 100M REUSE AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED LOGGING EXTENT MANAGEMENT LOCAL SEGMENT SPACE MANAGEMENT AUTO
区管理---- 本地
2.段管理方式
手工管理方式
自动管理方式
段管理---- 自动
分析表:
SQL> analyze table T2 compute statistics;
SQL> select segment_name,blocks,extents,bytes,segment_type,tablespace_name from dba_segments where segment_name='T2';
对表进行统计分析1
SQL> exec dbms_stats.gather_table_stats('SYS','T2');
SQL> select table_name,NUM_ROWS,BLOCKS,EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT,AVG_ROW_LEN FROM user_tables where table_name='T2';
索引列的统计信息的SQL语句
SQL>select BLEVEL ,LEAF_BLOCKS,DISTINCT_KEYS,AVG_LEAF_BLOCKS_PER_KEY,AVG_DATA_BLOCKS_PER_KEY,CLUSTERING_FACTOR from USER_INDEXES
列的统计信息
SQL> select NUM_DISTINCT,LOW_VALUE,HIGH_VALUE,DENSITY,NUM_NULLS,NUM_BUCKETS,HISTOGRAM from USER_TAB_COLUMNS;
区管理:本地 段管理:自动
查看表dba_extents的结构
SQL> select * from dba_extents where segment_name='T2';
区的自动管理:当连续的分配了很多区后,Oracle会认为目前处理的数据较大,一次性的分配大的区。
高水位线:一段建立了,分配一个区,区有很多块,在有数据表时,段会使用区中的块,高水位线指的是段使用的最后一个块
高水位线的意义:是Oracle数据库对表进行扫描时,代表最后一个位置
问题:在将数据删除后,高水位线还是在原来的位置,并没有随着数据的删除而下降
例子:假如一共有10万个块,高水位线在1000,删除1000块中保存的数据,高水位线还是在1000的位置。
高水位线影响得是全表扫描(对高水位线以下的)
例子:
先对表进行分析,在查询表相关信息
将表中数据删除后,在进行分析以及查看
降低高水位线
SQL> truncate table T2;
块
块头部信息 8K 块:物理地址
块属于哪个空间
事务槽 ZTL
行目录
块是从底下开始用的
块头是从上面开始用的
中间是空闲空间
行与行之间是串起来用的(所有行是连在一起的)
第一行头部连接第二行尾部,整体看起来貌似是一行,其实是多行
假如需要查找块中3行4列的数据,这是就需要用到块头部的行目录了
首先在行目录中找到第三行的起点,起点后面跟的是第一列的列宽,跳过列宽,就可以找到第四列。
数据库默认大小8k show parameter block;
行链接与行迁移
正常情况下:一个块里放多行,不允许行跨块
PCT_free空间是为了在进行update,增加空间的时候,不至于使块溢出
行链接:一个行10k,一个块8k,块是存不下这一 行,所以一个块存8k另一个块存2k,第一个块儿上写上第二个块的地址,行链接。
行迁移:由于PCT_free空间过小,update在更新的时候,空间不够用,将整个刚迁移出来,在迁移的位置上写上迁移的地址
如果行迁移过多的话,就会导致分为一个数据块实际*问了两个数据块
如何判断行链接与行迁移?
行的平均长度>块长度---- 块大小的问题
行的平均长度<块长度&&CHAIN_CNT过大---行迁移的问题
这需要对表进行重新的整理,将表导出再导入。
SELECT table_name,NUM_ROWS,BLOCKS, EMPTY_BLOCKS,AVG_SPACE,CHAIN_CNT, AVG_ROW_LEN
FROM USER_TABLES where table_name='TEST2';
从结果看目前
CHAIN_CNT 的值是 0
就是行迁移行链接数量值是0
说明在这方面做得比较好