zoukankan      html  css  js  c++  java
  • 3.Oracle数据结构

    1.前言

      这里说一下Oracle的数据结构(逻辑存储架构)  

      

    2.Oracle的数据存储结构

      1)表空间(tablespace) -- oracle最大的逻辑存储单位

      2)  数据文件(data file) -- 表空间物理存储载体(裸设备除外)

      3)段(segment) -- oracle所有占用空间的对象的总称

      4)extent  --段的组成单位

      5)数据块(data block) -- extent 的组成单位, 是oracle存储和数据操作的最小单位

    3.tablespace(表空间)

      表空间类型

      1)permanent:永久表空间

      2)undo:   撤销表空间

      3)temporary:临时表空间

      管理方式:

        段和区的管理方式是在建立表空间时确定的

        段管理方式有auto和manual两种,区管理方式有本地管理和字典管理(已淘汰)两种。

        

        注意:

        1)如果system表空间是数据字典管理,其他表空间可以是数据字典管理或者本地管理local(本地)

        2)字典管理可以转换为本地管理,但是对于系统表空间,要求执行一些附加步骤,比较麻烦    

        SQL>execute dbms_space_admin.tablespace_migragte_to_local('tablespacename');

      基本操作:

      1)创建表空间:

      sql>create tablespace test datafile '/data/oracle/oradata/orcl/test01.dbf' size 10m; 

      这里可以利用oracle提供的dbms_metadata.get_ddl包看看缺省值都给的是什么? 

    SQL>set serverout on;
    
    SQL> declare
    aa  varchar2(2000);
    begin
    select dbms_metadata.get_ddl('TABLESPACE','TEST') into aa FROM dual;
    dbms_output.put_line(aa);
    end;
    /  2    3    4    5    6    7  
    
    结果: CREATE TABLESPACE "TEST" DATAFILE '/data/oracle/oradata/orcl/test01.dbf' SIZE 10485760 LOGGING ONLINE PERMANENT BLOCKSIZE 8192 EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO ##关注最后一行,两个重要信息是:(1)区本地管理且自动分配空间,(2)段自动管理。
    PL/SQL procedure successfully completed.
    SQL>

      2)删除表空间  

      SQL>drop tablespace 表空间名 including contents and datafiles;
      contents:包括控制文件和数据字典信息,
      datafiles:这个物理文件

       数据库在open状态的时候不能删除如下表空间:

       1.system  2.active undo tablespace 3.default temporary tablespace 4.default tablespace

      数据库在open状态的时候不能offline的表空间的是:

      1.system 2.active undo tablespace 3.default temporary tablespace

     3)常用的查表空间命令 

    1.查看表空间大小
    SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_data_files group by tablespace_name;
    
    2.查看表空间空闲大小
    SQL> select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by tablespace_name;
    
    3.查看表空间(数据文件)是否是自动扩展
    SQL> col file_name for a40;
    SQL> select file_name,tablespace_name,bytes/1024/1024 mb,autoextensible from dba_data_files;

     4)建立大文件的表空间

      small file:在一个表空间中可以建立多个数据文件(默认)

      bigfile:在一个表空间中只能建立一个数据文件(该数据文件最大可达32T),简化对数据管理 

      SQL> create bigfile tablespace big_tbs datafile '/u01/oradata/prod/bigtbs01.dbf' size 100m;
      试图在该表空间下增加一个数据文件会报错
      SQL> alter tablespace big_tbs add datafile '/u01/oradata/prod/bigtbs02.dbf' size 100m;
      报错:ORA-32771: cannot add file to bigfile tablespace
      查看大文件表空间:
      SQL> select name,bigfile from v$tablespace;     

       大文件表空间

        优势:

        -减少数据库的数据文件个数(每个数据库64个数据文件)

        -方便文件管理,不需要人工干预表空间的文件大小

        -减少数据库对文件头同步开销

      

    3.segment(段)

      在oracle中,凡是被分配了空间的对象,都称之为段。

      特点

      1)表空间在逻辑上可以对应多个段,物理上是对应的是多个数据文件,一个段比较大时可以跨多个数据文件。

      2)创建一个表,oralce会为表创建一个(或多个)段,在一个段中保存该表的所有表数据(表数据不能跨段)

      3)段中至少有一个初始区,当这个段数据增加使得区(extent)不够时,将为这个段分配新的后续区。

      临时段:

      1)临时段也叫临时表空间,一般用作排序,(hash,merge... 需要一个中间数据处理区域,) 

      2)只要当oracle内存不够时,oracle才会在临时表空间上创建临时段

      3)临时段上的操作并不会记录redo log

      临时表:

      1)Oracle临时表只存在于某个会话或者事务的生命周期里,此时临时表的数据只对这个会话可见。

      2)临时表经常被用于存放一个操作的中间数据(数据的中间处理环节)

      3)临时表由于不产生redo,故能提高数据操作性能。

      4)临时表上也是可以创建索引的

      创建临时表: 

      语法:
      create
    global temporary 临时表名 on commit delete rows
      
      on commit delete row:临时表中的数据基于事务的,当事务提交或者回滚时,临时表中的数据将被清空
      on commit preserve row:临时表中的数据基于回话,当回话结束后,临时表中的数据被清空了

      段压缩:

      1) oracle允许对段进行压缩

      2)优点:1.减少存储空间,2.减少处理数据块(减少内存占用、提高io速度、提高查询效率)

      3)缺点:因为要额外地对数据进行处理,在数据插入时,会消耗更多的资源和时间

      语法:

        >create table 表名 compress  as select * from dba_objects;   ##设置压缩

        >alter  table  表名 nocompress ##取消压缩

      段压缩级别:

        1)表空间级别  2)表级(索引) 3)分区  4)子分区

        表空间级别:

          >create table 表名 tablespace 表空间名  as select * from dba_objects; ##这里的表空间是已经压缩过了的,然后再在这个表空间中创建表

          >select table_name,compression from user_tables where table_name='表名‘;

      段的管理方式:

        1)自动管理方式:简称ASSM(Auto segment space management) 采用位图管理段的存储空间

          简单说就是每个段的段头都有一组位图(5个位图),位图描述每个块的满度,根据满度的不同将每个块登记到相应的位图上,位图自动跟踪每个块的使用空间(动态),5个位图的满度按如下定义:满度100%75%50%25%0%,比如块大小为8k,你要插入一行是3k的表行,那么oracle就给你在满度50%的位图上找个登记的可插入的块。减少热点;

        ASSM的前提是EXTENT MANAGEMENT LOCAL,在ORACLE9I以后,缺省状态为自动管理方式,ASSM废弃pctused属性。

        自动段管理优缺点:

        优点:

          -简化管理,ASSM避免了手动设置参数大量的存储相关的参数,除了唯一的一个uctfree

          -增大并发度,如果有多个事务并发方位一个段,对于MSSM,由于使用freelist列表进行空间管理,导致大量的会话访问这些列表,出现资源的等待和争用,ASSM由于不使用freelist方式管理空间,会有效避免资源哦争用和等待。

          -Rac模式下可以改善并发性能(不需要各个实例间相互访问大量的freelist列表)

        缺点:

          -FTS(全表扫描)

          -大数据的加载,会导致性能下降

          -影响索引的集群因子(clustering factor)

         2) 手动管理方式:简称MSSM(manual segment space management) 采用的是freelist(空闲列表)管理段的存储空间。

          原理是:这时传统的方式,现在也在使用,涉及三个概念:freelist、pctfree、pctused.

         freelist:空闲列表中登记了可以插入数据的可用块,位置在段头,插入表行数据时首先查找该列表。

         pctfree:用来为一个块保留的空间百分比,以防止在今后的更新操作中增加一列或多列值的长度。达到该值,从freelist清除该块信息

         pctused:一个块的使用水位的百分比,这个水位将使该块返回到可用列表中去等待更多的插入操作。达到该值,该块信息登录到freelist

         pctused这个参数在ASSM下不使用,ASSM使用位图状态位取代了pctused.

        

        3)创建MSSM对象     

          SQL>create tablespace ts_mssm segment space management manual;
      
          SQL>create table t_m(id int) pctfree 20 pctused 20 storage(freelist 20 next 5M) tablespace ts_mssm;

          SQL>select pct_free,pct_used,freelists from user_tables where table_name='T_M'; ##查看相关信息

         4)手动段管理特点

          优点:1.给与DBM更大的空间管理余地   2.对于一些数据块操作非常敏感的场景依然有用。

          缺点:1.参数设置多. 2.参数设定值困难 3.需要更高水平的DBA

         

     

      

          .

       

      

      

      

  • 相关阅读:
    服务器带宽
    nload 源码安装
    Error: rpmdb open failed
    宽带,带宽,网速
    使用speedtest-cli测量服务器带宽
    ubuntu 安装 iperf
    微信退款机制
    记录程序执行之间,接口调用时间到日志文件或数据库
    机智的查询
    如果一些复杂的数据查询不好用数组,那就用字符串拼接,灵活方便
  • 原文地址:https://www.cnblogs.com/zmc60/p/15579484.html
Copyright © 2011-2022 走看看