zoukankan      html  css  js  c++  java
  • Oracle存储结构-段区块

      一个段建立以后首先会分配一个区,区中包括含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
    说明在这方面做得比较好

          

      

      

        

     

     

      

  • 相关阅读:
    pythonchallenge 2
    js动态改变img元素src在IE无效的问题
    自己设计的java web消息提示机制
    eclipse+PyDev里面import win32api报错的问题解决
    windows动态磁盘导致的分区问题
    sqlserver 遇到以零作除数错误的处理 不报错的解决方法
    iis7 运行 php5.5 的方法
    应用程序试图执行安全策略不允许的操作。要授予此应用程序所需的权限,请与系统管理员联系,或在配置文件中更改该应用程序
    C# 模拟用户登录
    ListBoxControl 删除选择的项的方法
  • 原文地址:https://www.cnblogs.com/KAJIA1/p/12084631.html
Copyright © 2011-2022 走看看