zoukankan      html  css  js  c++  java
  • oracle存储结构: 表空间/数据文件/段/分区/块

    字号:    

    一,段的种类

           1,表(table):

           2,分区表(table partition):一个有很大数据量的表;我们可以把表分区,每个分区可以放在不同的段上。以实现对表的优化

           3,簇(cluster):将多个表集合在一起,这些表拥有相同的列;这些相同列放在同一个物理的段里面。

           4,索引(index):

           5index-organized table(对应sqlserver的群集索引): 这些表中的数据以索引的大小按升序或者降序排列     

    6index partition(索引的分区): 关于索引的数据分别存于不同的物理段里面

           7undo segment: 有序循环的方式存储  (存放old value;读一致性;rollback recovery

           8temporary: 临时段用来排序

           9LOB segment: 存放大的数据,oracle里面将这些数据并不放在表内部,而是有专门一个段来存储

           10nested table(嵌套表):一个表中的某个字段的值是另外一个整表!

           11bootstrap segment:初始化我们的实例用的。这个段不需要维护和管理!

     

     

    二,oracle存储参数的设定及继承问题

    【记忆】默认为 Oracle default  === Tablespace (创建表空间时定义的参数) ==== Segment(优先级最高)

    【理解】初始参数 oracle block 5 ;意思是说你创建一个表,即使里面没存数据,它已经占用了8k×5=40kB的空间(这里假设oracle block size 8kB

     

     

    三,创建表时可以单独为表指定存储参数

    SQL> conn hr/123456@kk

    已连接。

    SQL> create table hello(id int)

      2  tablespace bkeep

      3  storage(initial 100k

      4  next 100k);

     

     

    【点子】我们来创建一个表空间test11,不带任何存储参数,然后打开oem看看它的存储参数(这些参数就是从oracle default哪里继承过来的!)

     

     

    四,extent的分配和重新分配

    -          当创建段时就分配空间

    -          当扩展段时给它分配空间

    -          强制分配空间给段(段可以跨数据文件,但不可以跨表空间;但是强制的段是不能跨数据文件获取空间的)

     

    创建表时,最初始的空间一定会分配给它!

    SQL> create table hello(id int)

      2  tablespace bkeep

      3  storage(initial 100k  //意思是,不管表里面有没有数据,都会占掉100k的空间

      4  next 100k);

     

    表已创建。

     

     

    五,【实验】强制分配分区

    1 我们想给hr.hello表在system01.dbf上划分1M的空间,

    结果:ORA-03284: 数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员

     

    SQL> alter table hr.hello

      2  allocate extent(size 1m datafile 'd:/oracle/oradata/kk/system01.dbf');

    alter table hr.hello

    *

    ERROR 位于第 1 :

    ORA-03284: 数据文件d:/oracle/oradata/kk/system01.dbf不是表空间BKEEP的成员

     

    2 现在我们给bkeep表空间增加一个数据文件bkeep03.dbf

    SQL> alter tablespace bkeep

      2  add datafile 'd:/oracle/oradata/kk/bkeep03.dbf' size 10M;

     

    3,再来给hr.hello表在bkeep03.dbf上强制划分1M空间

    SQL> alter table hr.hello

      2  allocate extent(size 1m datafile 'd:/oracle/oradata/kk/bkeep03.dbf');

     

    4 这里我们不指定数据文件,那么会不会是在建表的时候指定的那个数据文件上继续扩展呢?

    SQL> alter table hr.hello

      2   allocate extent(size 1m);

     

    【思考】 强制分配空间的时候会指定一个数据文件,当给该表分配的空间使用完以后,它将会怎么办?继续从该数据文件上面获取空间?还是从由local manage随机分配空间给它?

         答案:

     

     

    【重点】drop table xxx truncate table xxx  都会释放存储空间

     

    回收 hr.hello表没有用掉的空间

    SQL> alter table hr.hello

      2  deallocate unused;

     

     

    【记忆】data file分区的使用情况记录在文件的头(file hearder里面;主要有两种信息:Used extentFree extent

     

     

    六,database block 的大小

    I/O读写的最小单位: 读整个块到内存去 ;同理,内存的使用也以块大小为单位

           块的大小是在创建表空间时指定的

           DB_BLOCK_SIZE这个参数指定了缺省的块大小

     

    七,【实践检验真理】非标准块的使用方法:   验证db_16k_cache_size值的影响

    oracle现在支持多种块大小的表空间,但是要使用这个功能,必须指定支持对应块大小的内存缓存区!

     

    step1查看内存区为16k块分配的cache大小;结果:0

    SQL> show parameter db_16k_cache_size

     

    NAME                   TYPE        VALUE

    ------------------------------------ ----------- ----------------

    db_16k_cache_size         big integer       0

     

    step2创建表空间bkeep2 并指定其blocksize 16KB 结果:报错

    SQL> create tablespace bkeep2

      2  datafile 'd:/oracle/oradata/kk/bkeep202.dbf' size 10m

      3  blocksize 16k;

    create tablespace bkeep2

    *

    ERROR 位于第 1 :

    ORA-29339: 表空间块大小 16384 与配置的块大小不匹配

     

    step316kblock在内存中设置缓存;结果:没有足够内存来增加高速缓存的大小

    SQL> alter system set db_16k_cache_size=8m;

    alter system set db_16k_cache_size=8m

    *

    ERROR 位于第 1 :

    ORA-02097: 无法修改参数,因为指定的值无效

    ORA-00384: 没有足够的内存来增加高速缓存的大小

     

    step4我们收缩其它缓存 来给16k block 来用; 结果:标准块缓存12à4, 腾出了8m

    SQL> alter system set db_cache_size=4m;

     

    系统已更改。

     

    SQL> alter system set db_16k_cache_size=8m;

     

    系统已更改。

     

    SQL> show parameter db

     

    NAME                              TYPE        VALUE

    ------------------------------------            -----------     ---------------------------

    db_16k_cache_size                    big integer     8388608

    db_8k_cache_size                     big integer     0

    db_block_size                        integer        8192

     

    step5现在创建块大小为16kB的表空间bkeep2 结果:成功!

    SQL> create tablespace bkeep2

      2  datafile 'd:/oracle/oradata/kk/bkeep202.dbf' size 10m

      3  blocksize 16k;

     

     

    step6我现在又想db_16k_cache_size=0;结果:bkeep2表空间在用,所以不能设为0

    SQL> alter system set db_16k_cache_size=0;

    alter system set db_16k_cache_size=0

    *

    ERROR 位于第 1 :

    ORA-02097: 无法修改参数,因为指定的值无效

    ORA-00383: DEFAULT 高速缓存的块大小 16384 不能减少至零

     

    step7我把bkeep2表空间连同内容和数据文件全部删除,再来设db_16k_cache_size=0 ;结果:ok

    SQL> run

      1  drop tablespace bkeep2

      2* including contents and datafiles

     

    SQL> alter system set db_16k_cache_size=0;

     

    系统已更改。

     

     

    【思考】块大小为8k;我设对应的cache有如下特点。。搞不明白

    db_cache_size=9m  结果:12M

    db_cache_size=5m  结果:8M

     

    SQL> show parameter db_cache;

     

    NAME                                 TYPE        VALUE

    ------------------------------------            -----------       ---------------

    db_cache_size                        big integer      8388608

     

    SQL> alter system set db_cache_size=9m;

     

    SQL> show parameter db_cache;

     

    NAME                                 TYPE        VALUE

    ------------------------------------            -----------       ---------------

    db_cache_size                        big integer      12582912

     

    SQL> show parameter db_b

    NAME                                 TYPE        VALUE

    ------------------------------------              -----------    ---------------

    db_block_size                           integer        8192

     

     

    八,块的研究

           header: 有多少行! 使用空间的方式是 "自上往下"

           free space: 保留用于更新的空闲空间

           Data: 数据的填充方式是  "自下往上 "

     

    一级控制对空间的使用

    总共有四个参数:PCTFREEPCTUSEDINITRANSMAXTRANS

    PCTFREE

    PCTUSED

    【优化有关】 用上面两个参数来控制块中预留的空间大小。 为什么要预留空间呢? 为了将来更新时防止数据变大而导致 行移植!

    为什么要避免行移植呢? 行移植的意思就是一行记录被放到两个块里面,之间做了指针链接;将来查询这个数据的时候会读取两个块中的全部内容(block是最小读写单位),这样的话I/O负担就翻了一倍!

     

    【说明】 PCTFREE=20 20% 控制insert,为了给将来update用!! 呵呵,偏心吧!

     

     

    九,查看表的存储参数,在OEM里面

    "事务处理数量" ---- ‘初始值’对应‘INITRANS ‘最大值’对应‘MAXTRNS

    意思是:初始值允许一个事务对这个块的操作,最大的事务数量是255

     

     

    十,data block 的管理

           自动段空间管理

           手工管理段空间

     

    自动段管理  --推荐使用

                  1,借助位图来跟踪当前段的freeuse空间

                  2,对并发数据的插入有更好的性能!

    【疑问】如果表空间中包含LOBs对象,那么就不能使用自动段管理(难道我们的系统。。。。???天哪!)

     

     

    【常识】只能在创建表空间的时候指定段管理;以后在这个表空间中创建的对象都将继承它的段管理特性

     

     

    【点子】在kong3表空间中创建表test11

    OEM中查看表test11的存储特性

     “空闲列表”为灰色的,说明它是自动管理的

     

     

    十一,【重点】如何通过字典视图查看空间管理信息??

           每个对象所占有的分区都记录在DBA_EXTENTS里面

           表空间还有多少自由空间? DBA_FREE_SPACE

          

    表空间从物理上有“数据文件”组成;从逻辑上由“段”组成

    物理线路:DBA_TABLESPACES--àDBA_DATA_FILES--à DBA_FREE_SPACE + DBA_EXTENTS

    逻辑线路:DBA_TABLESPACES--àDBA_SEGMENTS---à DBA_FREE_SPACE + DBA_EXTENTS

     

    【重点】 这五个视图监控了系统存储这块的非常有用的信息;必须高度重视,经常使用!

    DBA_TABLESPACES

    DBA_SEGMENTS

    DBA_DATA_FILES

    DBA_FREE_SPACE

    DBA_EXTENTS

     

    【技巧】如何判断表空间是local管理还是数据字典管理

    SELECT * FROM DBA_TABLESPACE

    可以看到“表空间名称”“block_size”“初始分区”“next 分区”如果“next 分区”为空,说明是local管理

     

    【技巧】计算price表所占空间

    每个对象所占用的分区都记录在DBA_EXTENTS视图里面

    根据这个,我们可以计算authors表所占的空间

    计算price表所占空间

    SQL> SELECT sum(bytes) from dba_extents

         where owner='HR' and segment_name='PRICE'

     

    SUM(BYTES)

    ----------

    65536

     

     

    【记忆】表空间的作用:

           分离段,方便管理

           控制用户空间的分配(普通表,分区表,clusterLOBs 等等)

     

  • 相关阅读:
    获取Web.config的内容
    VS2013打开2008的项目
    Win7配置IIS7
    JavaScript通知浏览器,更改通知数目
    高分屏显示模糊修复工具
    Linux下使用 xrandr 命令设置屏幕分辨率
    虚拟机VMware怎么完全卸载干净,如何彻底卸载VMware虚拟机
    虚拟机安装VMware Tools
    网站测速、ping
    有名管道的非阻塞设置
  • 原文地址:https://www.cnblogs.com/sopost/p/2190163.html
Copyright © 2011-2022 走看看