方案(schema)是一个逻辑数据结构的集合。每个数据库用户拥有一个与之同名的方案,且只有这一方案(详情请见concepts第5章)。
数据库逻辑结构为数据块(Data Block)、数据扩展(Extent)、和段(Segment); 物理结构为数据文件。
Block是最精细的数据存储粒度,一个数据块相当于磁盘上一段连续的物理存储空间,oracle每次访问数据的单位是block。
Extent是为存储数据而分配的一组连续的block,只能在一个数据文件中。
Segment则是由一个或多个Extent。一张表可以看做是一个段,一个索引可以做作是一个段。查看段的分类select distinct segment_type from user_segments 。可以跨数据文件。
数据逻辑上存储表空间(Tablespace)中,而物理上则存储于属于表空间的数据文件(data file)中。
表空间管理
使用位图(而不是数据字典表)来跟踪使用和空闲空间
在表空间本地管理的情况下,Oracle先在表空间第一候选的 数据文件上寻找可以分配给第一个区段的空间,然后查看数据文件的位图来查看是否有足够数目的空闲块。如果数据文件没有足够的空闲块,然后Oracle会转向新的数据文件。
段空间分配方式
Uniform
AUTOALLOCATE
对于系统管理的区段,Oracle确定新增区段的最优大小,最小区段的大小是64K。如果表空间创建包括“segment space management auto”,如果数据库块大小是16k或者更高,然后Oracle管理段创建区段的最小尺寸是1M。这是持久表空间的默认管理方式。
select * from dba_segments where owner='表名';
表中的段分配
一个表在创建之后,除非进行truncate,否则数据库段中分配的所有数据块都只属于这个表。Oracle在一个块有足够空间的情况下插入新行。甚至你删除了表的所有行,Oracle也不会释放数据块,表空间的其他对象也无法使用这些数据块。
索引的段分配
只要索引存在,索引段中的所有区段都属于索引段。当你删除(drop)索引或者相关的表时,Oracle释放区段,本表空间的其他对象可以使用这部分空间。
临时段的段分配
当Oracle执行完一个需要临时段的语句时,Oracle自动删除临时段。如果排序操作能够在内存中进行,Oracle不会创建这个段。
回滚段的段分配
Oracle周期性的检查数据库的回滚段,来检查是否超过了它们的最优尺寸。如果回滚段远大于最优尺寸(也就是说,有太多的区段),然后Oracle会自动从回滚段中释放一个或者多个区段。
区的大小?
在我们默认的本地管理表空间中,extent是通过bitmap位图块来管理,Oracle通过内部的算法来自动决定下一个extent的大小
事例:
create table t(id number); select * from user_extents where segment_name='T'drop table t purge; create table t as select * from dba_objects; select * from user_extents where segment_name='T'
区是用来管理表,因为block粒度太小,一个表就是一个段。
总结
---获取dump存放路径(user_dump_dest)
show parameter dump;
--将文件添加一个头
alter session set tracefile_identifier = 'Look_For_Me';
--查询dump需要的file_id和block_id
select rowid,dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) num
from test where object_id =49;--主键id
--dump
alter system dump datafile 6 block 179;
----刷新buffer_cache
alter system flush buffer_cache;
--收集统计信息,这里没有收集直方图:
SQL> exec dbms_stats.gather_table_stats(ownname=>'SYS',tabname =>'DAVE',estimate_percent => 10 ,method_opt =>'FORCOLUMNS size 1',degree=>10,cascade => true);